Ruby为lambda分配上下文?

vor*_*bey 5 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
Run Code Online (Sandbox Code Playgroud)

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

Jos*_*eek 9

是的,但要小心,这个很容易被滥用.我个人会担心像这样的代码.

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
Run Code Online (Sandbox Code Playgroud)


for*_*orf 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
Run Code Online (Sandbox Code Playgroud)

  • 肯定好多了,但这里不需要 lambda,它只是一种方法。不过,我仍然对具有此类依赖项的代码感到担忧。当规则调用使人发生变异的方法时,问题就来了,现在如果不了解规则所做的一切,就无法了解人是如何变化的。当规则在随机类/文件中临时定义时,情况会变得更糟,您不能只是去阅读代码来了解。传入 obj 是正确的,但规则应该尽可能形式化,并且 Person 不应该是决定调用它们的人(将其推送给调用者)。 (3认同)