juz wyjasniam o co mi chodzi. mamy klasy
class People
attr_accessor :number, :document
end
class Document
end
teraz tworzymy sobie nowy plik, w ktorym odnosimy sie do zrodla naszych klas
require ‘./People.rb’
require ‘./Document.rb’
torrance = People.new
torrance.number = 1
torrance.document = Document.new
i teraz mamy clue programu. w metodzie instancji klasy Document, chcialbym moc odniesc sie do atrybutu number obiektu klasy People. np zrobic cos takiego:
def some_method
if torrance.number ==1
puts “hello world”
end
end
Ma ktoś pomysł, jak taki efekt (w postaci dzialajacej metody) osiagnac?
squil
April 2, 2013, 3:30pm
2
W tym przypadku chyba najlepiej tak:
[code=ruby]class Document
def some_method
torrance.hello_world
end
end
class People
def hello_world
puts “hello world” if number == 1
end
end[/code]
(Wyjasnienie: http://robots.thoughtbot.com/post/27572137956/tell-dont-ask )
EDIT:
Zeby osiagnac to z poziomu instancji Document ta instancja musi wiedziec o obiekcie torrance. Wiec bedziesz tez potrzebowal
torrance.document = Document.new(torrance: torrance)
nie o to mi jednak chodzi, Ty tutaj po prostu przepisales metode z jednej klasy do drugiej
squil
April 2, 2013, 3:44pm
4
Bo w przypadku jaki opisales, ta metoda tam powinna byc. Twoim problemem jest powiazanie obiektow, tzn. chcesz zeby obiekt People mial referencje do obiektu Document i odwrotnie. Wtedy wywolywanie metod jest proste.
squil
April 2, 2013, 4:06pm
6
Tak wiec: jesli uzywasz Railsow (w koncu forum railsowe) to potrzebujesz Associations (http://guides.rubyonrails.org/association_basics.html ). Jesli nie uzywasz to musisz z palca:
[code=ruby]class Person
def hello_world
puts “hello world” if number == 1
end
end
class Document
def initialize(person)
@person = person
end
def some_method
@person.hello_world
end
end
torrance = Person.new
torrance.number = 1
document = Document.new(torrance)
torrance.document = document[/code]
O to Ci chodzilo?
Uwagi poboczne:
Klasa prawdopodobnie powinna sie nazywac Person a nie People. Rowniez konwencja - nazwy plikow z malej litery.
musze przemyslec czy takie rozwiazanie mi nie narobi zamieszania w projekcie, ale dzieki za pomoc;]
Poczytaj sobie również o Low of Demeter .