Oto odpowiedź, której szukasz Classes and methods
. Przeczytaj uważnie.
Oto dobra dokumentacja z linku:
Klasy i metody
Teraz jesteśmy gotowi, aby stworzyć własną klasę adresową. Zacznijmy proste. Zacznijmy od adresu, który zawiera tylko pole "ulica".
ten sposób można zdefiniować klasę:
class Address
def initialize(street)
@street = street
end
end
Chodźmy przez to:
Słowo kluczowe klasa definiuje klasę.
Definiując metodę wewnątrz tej klasy, kojarzymy ją z tą klasą.
Metoda inicjalizacji jest tym, co faktycznie konstruuje strukturę danych. Każda klasa musi zawierać metodę initialize.
@street jest zmienną obiektową. Podobne do klawiszy skrótu. Znak @ wyróżnia @street jako zmienną obiektową. Za każdym razem, gdy tworzysz obiekt klasy Adres, ten obiekt będzie zawierał zmienną @street.
Użyjmy tej klasy, aby utworzyć obiekt adresu.
address = Addres.new("23 St George St.")
To wszystko. adres jest teraz obiektem klasy Adres Odczytywanie danych w obiekcie
Załóżmy, że chcemy odczytać dane w obiekcie adresu. Aby to zrobić, musimy napisać metodę zwracającą te dane:
class Address
def initialize(street)
@street = street
end
# Just return @street
def street
@street
end
end
Teraz metoda Adres # ulica umożliwia odczytanie ulicy adresu. In irb:
>> address.street
=> "23 St George St."
Właściwość obiektu widoczna na zewnątrz nazywana jest atrybutem. W tym przypadku street jest atrybutem. W szczególności jest to atrybut czytelny.Ponieważ ten rodzaj atrybutu jest bardzo powszechne, Ruby oferuje skrót poprzez słowo kluczowe attr_reader:
class Address
attr_reader :street
def initialize(street)
@street = street
end
end
Zmiana danych w obiekcie
Możemy również zdefiniować metodę, aby zmienić dane w obiekcie.
class Address
attr_reader :street
def initialize(street)
@street = street
end
def street=(street)
@street = street
end
end
Ruby jest całkiem mądry w jego wykorzystania ulicy = metoda:
`address.street = "45 Main St`."
Zauważ że można umieścić obowiązuje BETTEN ulicę i =. Teraz, gdy możemy zmienić dane adresowe, możemy uprościć metodę inicjalizacji i ustawić domyślną ulicę na pusty ciąg "".
class Address
attr_reader :street
def initialize
@street = ""
end
def street=(street)
@street = street
end
end
address = Address.new
address.street = "23 St George St."
To może nie wydawać się dużo uproszczeń, ale gdy dodamy miasto, stan i ZIP pola i więcej metod uczyni to definicja klasy nieco prostsze.
Teraz ulica jest również atrybutem zapisywalnym. Tak jak poprzednio, można zadeklarować je jako takie z attr_writer:
class Address
attr_reader :street
attr_writer :street
def initialize
@street = ""
end
end
dostępu do danych
Bardzo często trzeba atrybuty, które są oba atrybuty odczytu i zapisu. Ruby pozwala je scalić razem z attr_accessor. Sądzę, że nazywałoby się to "dostępnymi atrybutami", ale nigdy nie widziałem, żeby tak się nazywało.
class Address
attr_accessor :street
def initialize
@street = ""
end
end
Dzięki tej wiedzy łatwo jest teraz zdefiniować całą strukturę książki adresowej. Jak się okazuje, attr_accessor i znajomi akceptują wiele argumentów.
class Address
attr_accessor :street, :city, :state, :zip
def initialize
@street = @city = @state = @zip = ""
end
end
Rozumiem. Metoda inicjalizacyjna służy do inicjowania wartości podczas tworzenia obiektów. Nie jest to konieczne, ale jeśli obiekt ma wiele atrybutów, ma sens, aby móc zrobić to wszystko naraz, zamiast tracić czas i ustawić wszystkie atrybuty później, po stworzeniu. Tak? – David
@Do sortowania. Ograniczeniem jest to, że jeśli obiekt ma wiele atrybutów, inicjator szybko staje się bezużytecznym bałaganem uporządkowanych parametrów. Właśnie dlatego (a) mamy teraz nazwane parametry i/lub (b) możesz użyć map, aby zwiększyć czytelność w miejscu budowy. –
@DaveNewton czy masz bardzo krótki przykład obu? Chyba wiem, co masz na myśli, ale chcesz być pewny. Kiedy mówisz, że mamy teraz nazwane parametry, czy sugerujesz, że kiedyś tak było? Jak inaczej moglibyśmy powiedzieć "chcę wziąć ten i ten parametr" podczas definiowania metody? – David