是否有可能不为lambda分配上下文?
例如:
class Rule
def get_rule
return lambda {puts name}
end
end
class Person
attr_accessor :name
def init_rule
@name = "ruby"
Rule.new.get_rule.call() # should say "ruby" but say what object of class Rull, does not have variable name
# or self.instance_eval &Rule.new.get_rule
end
end
我的目标是 - >没有上下文的存储过程对象,并在特定位置调用之前分配上下文。有可能吗?
答案 0 :(得分:8)
是的,但要小心,这个很容易被滥用。我个人会担心这样的代码。
class Rule
def get_rule
Proc.new { puts name }
end
end
class Person
attr_accessor :name
def init_rule
@name = "ruby"
instance_eval(&Rule.new.get_rule)
end
end
答案 1 :(得分:8)
派对有点迟了,但这是通过明确地将上下文传递给规则来实现此目的的另一种方式。
class Rule
def get_rule
return lambda{|context| puts context.name}
end
end
class Person
attr_accessor :name
def init_rule
@name = "ruby"
Rule.new.get_rule.call(self)
end
end
Person.new.init_rule
#=> ruby
答案 2 :(得分:1)
本着迟到的精神; - )
我认为你在这里使用的模式是策略模式。 这分离了改变“规则”的代码与之间的关注点 被重用的部分“人”。这种模式的另一个优势是 您可以在运行时更改规则。
它看起来如何
class Person
attr_accessor :name
def initialize(&rules)
@name = "ruby"
instance_eval(&rules)
end
end
Person.new do
puts @name
end
=> ruby