Wyjątki - niedziałający kod

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. :smile:

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”}”

#Przechwyć każdy wyjątek:

rescue ArgumentError => e
puts “Nieprawidłowe wywołanie metody. Komunikat Ruby: #{e}”

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 :slight_smile:

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. :slight_smile:

Problem rozwiązany! Dziękuje.

Aczkolwiek tego z przytaczaniem wyjątków nie rozumiem :stuck_out_tongue:

No napisałeś o “błędach, które Ci wywala konsola”, a nie wkleiłeś tych błędów.

aa ok :smiley: bede pamiętam na przyszłość :smiley:

Tu nawet nie trzeba nic dodawać w tym kodzie :wink: 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…

Pozdrawiam,
Pat

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 :wink:

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 :wink: 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ę :wink:

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.