• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Coś popsułem w ruby...

Object Storage Arubacloud
0 głosów
409 wizyt
pytanie zadane 20 grudnia 2017 w Ruby przez Q7V Gaduła (4,250 p.)
zmienione kategorie 20 grudnia 2017 przez Comandeer

Cześć, zrobiłem trzy proste programy w ruby, każdy z nich nie działa... :/

1##
  GNU nano 2.9.1                             kalkulator.rb                                       

puts "Podaj dwie liczby"
a = gets.to_i
b = gets.to_i
puts "Wybierz operację\n1 - Dodawanie\n2 - Odejmowanie\n3 - Mnożenie\n4 - Dzi$
c = gets.to_i
$d.to_i #zmienna pomocnicza
else
case c
when 1
d=a+b
puts "#{d}"
when 2
d=a-b
puts "#{d}"
when 3
d=a*b
puts "#{d}"
when 4
d=a/b
puts "#{d}"
when 5
d=a%b
puts "#{d}"
else
puts "Coś poszło nie tak"
end

2##

$i = 0.to_i
$a = gets.chomp.to_i
while $a > $i do
puts "#{i}"
$i=$i+1
end


3##

puts "Podaj swój wzrost"
$w = gets

case $w
when 0 .. 140
puts "Jesteś bardzo niski"
when 141 .. 160
puts "Jesteś niski"
when 161 .. 180
puts "Jesteś średni"
when 181 .. 195
puts "Jesteś wysoki"
when 196 .. 205
puts "Jesteś bardzo wysoki"
when 205 .. 500
puts "Jesteś za wysoki"
end

Z tymże 3 program nie wyświetla żadnego błędu, wykonuję się poprawnie i nic nie zwraca.

Pierwszy wypluwa -

kalkulator.rb:12: syntax error, unexpected keyword_when, expecting end-of-input
when 2


Drugi -

whilezakres.rb:4:in `<main>': undefined local variable or method `i' for main:Object (NameError)


Na początku drugi działa OK, prosi o zmienną, ale następnie wywala w/w błąd. Pewnie problem leży w szczegółach, miesiąc temu załapałem podstawy ruby i teraz mam więcej czasu to chcę się bardziej podszkolić, a bez podstaw będzie ciężko. ;p

2 odpowiedzi

+1 głos
odpowiedź 23 grudnia 2017 przez Aluzja Nowicjusz (200 p.)
Robisz sporo błędów składniowych. Wygląda to trochę jakbyś miał jakieś przyzwyczajenia z innego języka.

Jestem kompletnie zbita z tropu dlaczego stawiasz znaki "$", np. w linii 9 albo 33, 34 i wielu innych.

Zadania:

1)
- W linii 10 jest zagubione "else" niepasujące do niczego. Pewnie zostało po jakiś modyfikacjach.

2)
- Linia 33: Ten zapis nie ma sensu ($i = 0.to_i). Na zerze, czyli obiekcie typu Integer nie da się wywołac metody to_i. To jest metoda konwertująca obiekty typu String na Integer. Jeśli chciałeś do zmiennej "i" przypisać wartość zero to robi się to w taki sposób: i = 0
*- Linia 34: Bez poprawiania ta linijka kodu i tak działa tylko zawiera nadmiarowy kod. $a = gets.chomp.to_i
Jeśli konwertujesz wartość pobraną metodą gets na Integer metedą to_i to nie potrzebujesz ucinać \n metodą chomp, bo metoda to_i potrafi sobie sama z tym poradzić.
*- Linia 35: "do" jest nadmiarowe, ale bez usuwania program też działa
- Linia 36: Jeśli zadeklarowałeś w linii 33 zmienną "$i" to w puts też musisz wpisać "$i", a nie samo "i"
*- Nie musisz treści puts umieszczać w cudzysłowie. Starczy, że wpiszesz puts &i
Ruby będzie potrafił odpowiednio to zainterpretować.

3)
- Linia 44: tutaj brakuje tylko konwersji pobranej wartości na Integer, bo metoda gets domyślnie pobiera dane w typie String. Czyli należy napisać: $w = gets.to_i

No to tyle. Jeszcze raz muszę to napisać: strasznie mnie intryguje, dlaczego używasz $ w nazwach zmiennych. Z czego to przyzwyczajenie pochodzi?
komentarz 30 grudnia 2017 przez Bantu Nałogowiec (34,170 p.)
Zmienne z '$' to są zmienne globalne. Ogólnie jest to ekstremalnie zła praktyka.
Jednak sądzę, że autor po prostu czerpie wiedzę ze złych materiałów, w których sam autor tez nie wiedział po co ten znak, albo ja sam nie wiem. Jak pracuje w Ruby od jakiś 4 lat to pierwszy raz widzę, żeby ktoś używał '$' w taki sposób.
Serio nie korzystajcie '$', bo to ekstremalnie zła praktyka!
+1 głos
odpowiedź 7 stycznia 2018 przez Bdabrowski Nowicjusz (160 p.)
edycja 7 stycznia 2018 przez Bdabrowski
Po pierwsze w ruby nie stawiamy $ przed zmienną.

W pierwszym usuń $ i 'else' w 10 linii, po 'puts' w 4 linii wstaw " i po 'puts' w case'ie wystarczy po prostu same 'd'.

W drugim usuń $ i zamiast 'puts "#{i}"' wystarczy proste puts 'i'.

Co do trzeciego to musisz dodać zamianę na Integer w pobieraniu danych. Np.    w = gets.to_i

Chodzi tu o traktowanie gets jako ciąg znaków z klawiatury czyli String, a jak wiemy nie da się porównać Stringa z Integerem.

Pozdrawiam!

Podobne pytania

0 głosów
1 odpowiedź 141 wizyt
pytanie zadane 9 lipca 2023 w Ruby przez whiteman808 Obywatel (1,820 p.)
+1 głos
1 odpowiedź 258 wizyt
pytanie zadane 1 lutego 2022 w Ruby przez doskanoness Obywatel (1,240 p.)
–4 głosów
4 odpowiedzi 783 wizyt
pytanie zadane 6 września 2021 w Ruby przez Teknal Początkujący (290 p.)

92,536 zapytań

141,377 odpowiedzi

319,456 komentarzy

61,922 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...