调用实例方法而不通过Ruby元编程指定实例?

时间:2010-12-20 04:08:09

标签: ruby metaprogramming

如何设计范围方法让它实际放入row.city?

row.scope do 
  puts city
end

2 个答案:

答案 0 :(得分:3)

使用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 :(得分:1)

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

如果你不想猴子修补对象,你可以选择:

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”:)