如何设计范围方法让它实际放入row.city?
row.scope do
puts city
end
答案 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”:)