ruby, как определить метод писателя с "<<" - PullRequest
0 голосов
/ 20 сентября 2010

У меня есть класс скелета:

class Foo
   def bar
    # returns some sort of array
   end
end

но как добавить метод 'writer' в 'bar', чтобы включить поведение толчка Array #?

Foo.new.bar<<['Smile']
_.bar #=> ['Smile']

Редакция: Я должен расширить свой вопрос дальше. Есть два класса. Foo и Bar, во многом как отношение ActiveRecord has_many, где Foo has_many Bars

Но я на самом деле храню идентификаторы Bar внутри метода Foo. Я называю этот метод bar_ids

so @foo = Foo.new (: bar_ids => [1,2,3])

Как вы можете себе представить, если я когда-нибудь захочу посмотреть, что принадлежит Bars @foo, я должен сделать что-то вроде Bar.where (: id => @ foo.bar_ids)

Поэтому я решил создать другой метод с именем bar, чтобы сделать именно это. класс фу # ... Def Bar Bar.where (: id => bar_ids) конец конец

Это сработало. теперь я могу сделать @ foo.bar # => все бары, принадлежащие @ foo

Теперь я также хочу использовать такой метод push, как ассоциации ActiveRecord, просто чтобы вырезать тип "id" при связывании другого объекта bar с объектом foo

В настоящее время это работает: @ foo.bar_ids << Bar.new.id @ Foo.save </p>

Но я хочу: @ foo.bar << Bar.new #, где будет добавлен идентификатор нового бара в методе bar_ids @foo @ Foo.save </p>

Спасибо за вашу помощь, я очень ценю ваши мысли по этому поводу!

Ответы [ 3 ]

2 голосов
/ 20 сентября 2010
class Foo
   attr_reader :bar
   def initialize
     @bar = Array.new
     def @bar.<< arg
       self.push arg.id
     end
   end

end

class Bar
  attr_accessor :id
  def initialize id
    self.id = id
  end
end


f = Foo.new
bars = (1..5).map{|i| Bar.new i}

f.bar << bars[2]
f.bar << bars[4]

p f.bar  #=> [3, 5]
1 голос
/ 20 сентября 2010

Возвращает объект, для которого определен метод <<.

0 голосов
/ 20 сентября 2010

Если я не понимаю, что вы хотите, почему бы просто не сделать метод bar получателем для внутреннего элемента массива?

class Foo
  attr_reader :bar

  def initialize
    @bar = []
  end
end

f = Foo.new
f.bar << 'abc'
# f.bar => ['abc']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...