Ruby为lambda分配上下文?

时间:2011-09-19 11:54:21

标签: ruby lambda

是否有可能不为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

我的目标是 - >没有上下文的存储过程对象,并在特定位置调用之前分配上下文。有可能吗?

3 个答案:

答案 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