Вызвать метод экземпляра без указания экземпляра с помощью метапрограммирования Ruby? - PullRequest
1 голос
/ 20 декабря 2010

Как спроектировать метод области видимости, чтобы он действительно помещал row.city?

row.scope do 
  puts city
end

Ответы [ 2 ]

3 голосов
/ 20 декабря 2010

Использование instance_eval:

class RowClass
  attr_accessor :city

  def scope(&blk)
    instance_eval(&blk)
  end
end

row = RowClass.new
row.city = "bla"

row.scope do 
  puts city # prints "bla"
end
1 голос
/ 20 декабря 2010
class Object
  def scope(&block)
    instance_eval(&block)
  end
end

Thing = Struct.new(:city)
row = Thing.new "Bryn Athyn"

row.scope{ puts city }
#=> Bryn Athyn

Если вы не хотите обезьяна-патч для Object, вы могли бы альтернативно:

module Scopeable
  def scope(&block)
    instance_eval(&block)
  end
end

Thing = Struct.new(:city)
row = Thing.new "Bryn Athyn"
row.extend(Scopeable)

row.scope{ puts city }
#=> Bryn Athyn

Хотя, учитывая это, возможно, проще всего просто:

class Object
  alias_method :scope, :instance_eval
end

Или еще проще ... просто используйте "instance_eval" вместо "scope":)

...