Ruby – zajęcia 2

Na ostatnich zajęciach napisaliśmy metodę. Metoda jest to pewne polecenie, które możemy wykonać na obiekcie. Na przykład mając klasę Osoba:

class Osoba
  def ileLat(kiedy)
    kiedy - @rokUr
  end
end

możemy policzyć, ile dana osoba ma lat za pomocą metody ileLat. Jednak próba policzenia się nie powiedzie – musimy przecież podać rok urodzenia. Dokonujemy tego w konstruktorze:

class Osoba
  def initialize(rok)
    @rokUr = rok
  end

  def ileLat(kiedy)
    kiedy - @rokUr
  end
end

Żeby pobawić się tą klasą, potrzebny nam będzie interaktywny Ruby. Uruchamiamy go poleceniem irb -r ./osoba.rb. Zobaczmy, jak działa klasa:

irb(main):001:0> ja = Osoba.new(1991)
=> #<Osoba:0x000000023ee5e8 @rokUr=1991>
irb(main):002:0> ja.ileLat(2013)
=> 22
irb(main):003:0> ja.rokUr
NoMethodError: undefined method `rokUr' for #<Osoba:0x000000023ee5e8 @rokUr=1991>
	from (irb):3
	from /usr/bin/irb:12:in `<main>'
irb(main):004:0> ja.rokUr = 2000
NoMethodError: undefined method `rokUr=' for #<Osoba:0x000000023ee5e8 @rokUr=1991>
	from (irb):4
	from /usr/bin/irb:12:in `<main>'

Zatem możemy korzystać z metody ileLat, zaś nie możemy pracować na właściwości rokUr. By korzystać z rokUr piszemy:

attr_accessor :rokUr

Jednak nam zależy na tym, by rok urodzenia się nie zmieniał. Dodatkowo chcemy móc ustawić hasło, ale nie móc go odczytać. Dlatego nasza klasa wygląda tak:

class Osoba
  attr_reader :rokUr
  attr_writer :haslo

  def initialize(rok)
    @rokUr = rok
  end

  def ileLat(rok)
    rok - @rokUr
  end
end

Odpalmy interaktywne Ruby:

irb(main):001:0> ja = Osoba.new(1991)
=> #<Osoba:0x00000001362300 @rokUr=1991>
irb(main):002:0> ja.rokUr
=> 1991
irb(main):003:0> ja.rokUr = 2000
NoMethodError: undefined method `rokUr=' for #<Osoba:0x00000001362300 @rokUr=1991>
	from (irb):3
	from /usr/bin/irb:12:in `<main>'
irb(main):004:0> ja.haslo
NoMethodError: undefined method `haslo' for #<Osoba:0x00000001362300 @rokUr=1991>
	from (irb):4
	from /usr/bin/irb:12:in `<main>'
irb(main):005:0> ja.haslo = 'tajne'
=> "tajne"
irb(main):006:0> ja.haslo
NoMethodError: undefined method `haslo' for #<Osoba:0x00000001362300 @rokUr=1991, @haslo="tajne">
	from (irb):6
	from /usr/bin/irb:12:in `<main>'

Zatem, attr_reader dodaje metodę odczytującą, attr_writer przypisującą, zaś attr_accessor obie.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *