2013-07-05 16 views
8

Jakie są zalety i wady stosowania Struct w porównaniu do definiowania metody initialize?Ruby: Struct vs Initialize

Już widzę, że obejmuje mniej kod i nie podnosząc gdy brakuje argumentu:

Korzystanie struct:

class Fruit < Struct.new(:name) 
end 

> Fruit.new.name 
=> nil 
> Fruit.new('apple').name 
=> "apple" 

Korzystanie zainicjować:

class Fruit 
    attr_accessor :name 

    def initialize(name) 
    @name = name 
    end 
end 

> Fruit.new.name 
ArgumentError: wrong number of arguments (0 for 1) 
> Fruit.new('apple').name 
=> "apple" 

Jakie są twoje myśli? Czy często używasz Struct w swoich projektach?

+1

Jaki jest twój przypadek użycia? "Struct" świetnie nadaje się do rzeczy, które nie mają dużo dodatkowej logiki. – tadman

+0

Po prostu chcę o tym myśleć, kiedy trzeba zdefiniować klasy za pomocą inicjalizatorów. Ponieważ użycie 'Struct' wydaje się być" bardziej sexy ", chciałbym poznać listę rozwijaną, jeśli taka istnieje. –

+0

Jeśli masz konkretny przypadek użycia, jest to pytanie na temat. Jeśli chcesz tylko stworzyć dyskusję na temat zalet i wad różnych implementacji, to nie pasuje to do formatu pytań i odpowiedzi. –

Odpowiedz

14

Klasa (non-struct) ma prostszą drzewo potomków:

>> Fruit.ancestors 
=> [Fruit, Object, Kernel, BasicObject] 

W porównaniu do wersji struct:

>> Fruit.ancestors 
=> [Fruit, #<Class:0x1101c9038>, Struct, Enumerable, Object, Kernel, BasicObject] 

Tak, klasa Struct mogłyby być mylone z tablicy (rzadko, ale absolutnie może się zdarzyć)

fruit = Fruit.new("yo") 
# .. later 
fruit.each do |k| 
    puts k 
end 
# outputs: yo 

Więc ... Używam struktur jako obiektów danych wyrzucanych. Używam "prawdziwych" klas w mojej domenie i aplikacji.

+0

Interesujące! Na pewno nie chcesz ich używać jako "klasy", jeśli nie zachowują się wtedy tak, jak wtedy. Dzięki. Zobaczę, co inni mają do powiedzenia na ten temat i zaakceptuj odpowiedź odpowiednio :) –

+9

Myślę, że właściwym pomysłem jest tutaj użycie 'Struct' dla prostych kontenerów danych, jako alternatywy dla przekazywania Hashów i używania właściwego obiektu kiedy faktycznie dodajesz jakąkolwiek logikę. – tadman