Witam mam dwa pliki kodu które sam napisałem z pomocą książki do ruby. Jednak nie moge zrozumieć błędów które konsola mi wywala. Prosze o pomoc.
I plik:
*#Skrypt 11.4 - circle.rb
class Circle #Dołączenie do klasy mieszanej Comparable:
include Comparable #accesor dla promienia koła
attr_reader :radius #konstruktor
def initialize(r = ‘’)
raise ArgumentError.new(‘Promień musi być liczbą dodatnią’)
unless (r.is_a? Numeric) && (r > 0) @radius = r
end #definicja ogólnego operatora porównania:
def <=>(rh)
raise TypeError.new(‘Oba obiekty muszą być typu Circle!’)
unless r.is_a? Circle @radius <=> rh.radius
end
end #koniec definicji klasy Circle.*
II plik:
#Skrypt 11.2 - circles.rb
require_relative ‘circle.rb’
#Rozpoczecie wyjątku bloku wyjątków:
begin
#Utorzenie dwóch kół (jendo z błędem):
c1 = Circle.new(5)
c2 = Circle.new(‘kot’)
c3 = Circle.new(-23.45)
c4 = ‘Witaj świecie!’
#Wyświetl porówanianie:
puts "c1 większe lub równe c2:
#{c1 >= c2 ? “tak " : “nie” }”
#Wyślwiel porówanie powodujące błąd:
puts “c2 jest pomiędzy c1 i c4: #{c2.between?(c1, c4) ? “tak” : “nie”}”
rescue NameError => e
puts “Próbujesz użyć klasy lub metody która nie istnieje.
Sprawdź pisownię oraz dostępną dokumentację.\nKomunikat Ruby: #{e}”
rescue TypeError => e
puts “Używasz niewłaściwego typu obiektów. Komunikat Ruby: #{e}”
rescue => e
puts “Wystąpił wyjątek innego typu niż ArgumentError i NameError. Komunikat Ruby #{e}”
end
Prosiłbym o łopatologiczne wytłumaczenie i instrukcje co źle zrobiłem bo jestem początkujący
Czyżby syntax errory? W pierwszym pliku nie zamykasz obydwu metod, więc parser się skarży że nie pasuje mu liczba słów kluczowych end. Powinno być:
class Circle
#Dołączenie do klasy mieszanej Comparable:
include Comparable
#accesor dla promienia koła
attr_reader :radius
#konstruktor
def initialize(r = '')
raise ArgumentError.new('Promień musi być liczbą dodatnią')
unless (r.is_a? Numeric) && (r > 0)
@radius = r
end
end
#definicja ogólnego operatora porównania:
def <=>(rh)
raise TypeError.new('Oba obiekty muszą być typu Circle!')
unless r.is_a? Circle
@radius <=> rh.radius
end
end
end #koniec definicji klasy Circle.*
I BTW z reguły jest łatwiej kiedy przytoczysz te wyjątki.
Tu nawet nie trzeba nic dodawać w tym kodzie W pierwszym skrypcie te Twoje “unless” niepotrzebnie jest w linijce pod raise ArgumentError…
Chodzi o to, że jak posługujesz się skróconą składnią to ten warunek musi być w tej samej linijce!
Np.
if x < 10
do_something
end
możesz zapisać jako:
do_something if x < 10
ale nie jako:
do_something
if x < 10
To pokrywa się z Twoim innym problemem- linię kodu w Rubym kończy enter albo średnik. Jeżeli w tym przypadku ten if jest w nowej linii to spójrz: do_something tak czy inaczej się wykona, natomiast błąd powoduje to, że nie zamknąłeś ifa…
dzięki ;] Może troche poza tematem ale zapytam. Czy jest gdzieś spis takich rzeczy jak różnice między rubym 2.0 (2.1) a 1.9? Przyznam że czasami zastanawiam się czy jak coś robie (a ucze się z książki 1.9) to po prostu nie wiem czy jest to poprawne czy nie. Chodzi mi głównie o podstawy
Poszukaj na stack overflow, przeczytaj w dokumentacji Ruby’ego opis tego, co Cię interesuje. Jest także bardzo treściwa książka o dostępnych klasach w Rubym Wszystkiego i tak człowiek nie spamięta i o te różnice się nie martw- zawsze znajdziesz odpowiedź w necie, jak będziesz dobrze szukał, więc kontynuuj naukę
Jeśli uczysz się z książki o 1.9, a korzystasz z Rubiego w wersji 2.x, nie powinieneś mieć z tego powodu żadnych problemów - Ruby 2.x jest kompatybilny wstecznie z 1.9.