2015-08-23 9 views
-1

У меня есть два класса:поделитесь переменным экземпляром с другим классом

class Zoo 

    def initialize(visitor) 
     @visitor = visitor 
    end 

    def elephant 
     Elephant 
    end 

end 

class Elephant 

    def self.all 
     [:e1, :e2, :e3].reject_if { |e| @visitor.has_seen?(e) } 
    end 

end 

Очевидно, что приведенный выше пример не будет работать.

Есть ли способ, чтобы выразить это, так что я могу назвать:

Zoo.new(:visitor_1).elephant.all 

и доступ @visitor внутри метода Elephant класса?

+1

Совершенно не ясно, что вы делаете. – sawa

+0

Извините, если не ясно, в нижней строке я хочу написать: 'Zoo.new (: visitor_1) .elephant.all'. 'Zoo' и' Elephant' должны быть разными классами, а 'Elephant' нуждается в доступе к переменной экземпляра' @ visitor' в методах класса. – user1032752

+0

Невозможно сделать это. Одна из причин заключается в том, что Ruby не разрешает доступ к переменной экземпляра без доступа или интроспекции; другой - если вы делаете 'z1 = Zoo.new (: v1); z2 = Zoo.new (: v2); Elephant.all', который '@ visitor' следует искать? То есть как слон знает, где он? Это не имеет никакого смысла. Если вы дали нам реальное приложение, которое вам нужно вместо плохой метафоры зоопарка, мы могли бы предложить альтернативный дизайн. – Amadan

ответ

1

Не зная больше о моделях в вашем приложении, это то, что вы могли бы сделать

class Elephant 

    def self.all(visitor) 
     [:e1, :e2, :e3].reject_if { |e| e.seen_by_visitor?(visitor) } 
    end 

    def seen_by_visitor?(visitor) 
     # whatever code you need here to determine whether the given visitor has seen the elephant 
    end 

end 

class Zoo 

    def initialize(visitor) 
     @visitor = visitor 
    end 

    def elephants 
     Elephants.all(@visitor) 
    end 

end 

Обратите внимание, что в настоящее время Zoo зависит от Elephant, но Elephant не зависит от Zoo.

Смежные вопросы