ruby - 如何从 lambda 创建和返回 Ruby 类?

标签 ruby

我正在尝试创建一个将返回 stub 类的 lambda。这是我得到的:

engine_stub = lambda { |valid|
  Class.new {
    def valid?(address)
      valid
    end
  }
}

lambda 应该返回一个类,其valid? 实例方法始终返回传递给 lambda 的值。此代码因错误而失败:

NameError: undefined local variable or method `valid' for #<#<Class:0x007f4bf0ebd
0f0>:0x007f4bf0ebcd08>

很明显,该方法无法访问 lambda 范围。我也试过这个:

engine_stub = lambda { |valid|
  stub_class = Class.new
  def stub_class.valid?(address)
    valid
  end
  return stub_class
}

反而会导致这个错误:

NoMethodError: undefined method `valid?' for #<#<Class:0x007fecbada1138>:0x007fec
bada0df0>

所以现在我没能使 valid? 成为一个实例变量。

总结

我正在尝试让 lambda engine_stub 返回一个类,其中包含一个实例方法 valid?,该方法返回传递给 lambda 的值。我该怎么做?

最佳答案

关键字 def 是作用域门,因此您应该通过 define_method{} 定义方法

engine_stub = -> valid do
  Class.new { define_method :valid? do valid end }
end

关于ruby - 如何从 lambda 创建和返回 Ruby 类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16980316/

相关文章:

javascript - Ember ownsTo 关系在保存时传递为 nil 到服务器

arrays - 在 ruby​​ 中压缩不均匀数组

ruby-on-rails - Rails/Active Record FAILSAFE 错误 "User can' t 被引用”

ruby - 用于 ruby​​ 脚本的 Linux 命令

ruby-on-rails - PDFTK 服务器生成空 pdf(El Capitan 问题)

ios - Apple MDM - 无法解密配置文件(未安装此配置文件的解密 key )

ios - Frank 在运行 Frank setup 或 Frank build 时未找到任何目标

ruby-on-rails - 在 ERB 内联代码中获取第一个非 nil 数组值

ruby-on-rails - 如何在 Rails 5 应用程序中正确加载 lib 模块和类

ruby - 每隔一个删除一个元素,直到剩下一个 ruby