【问题标题】:Ruby 1.9 blocks without variables没有变量的 Ruby 1.9 块
【发布时间】:2012-03-12 22:36:04
【问题描述】:

我正在将代码库从 1.8 升级到 1.9。我在我的代码中遇到了几个地方(只有规范,不确定这是否是巧合),其中没有变量的块存在问题。给他们一个虚拟变量可以解决这个问题。这是一个例子:

在工厂女孩工厂中,这在 1.8 下有效:

Factory.define :thing do |t|
  t.price { 1 - 0.01*rand(10) }
end

在 1.9 下,rand(10) 返回nil。很奇怪。我绞尽脑汁想为什么街区内的环境会有所不同。问题是,rand 甚至不是来自标准库——它来自核心语言!因此,环境并没有真正产生影响的方式。

然后我记得我的规范中的其他一些地方因为无变量块而被破坏,所以我一时兴起把一个放在那里,你瞧,它起作用了。

Factory.define :thing do |t|
  t.price { |dummy| 1 - 0.01*rand(10) }
end

这是怎么回事?

【问题讨论】:

  • Lambdas、Procs 和块在 Ruby 中的行为都不同,因此请务必指定正确的,而不是互换它们。我相信你的意思是 blocks,而不是 Procs/lambdas。
  • 哎呀——是的,我知道,只是在阅读有关 lambdas 的其他内容并将其放在大脑中:D 现在已修复
  • 这一定和Factorygirl有关。例如,这在我的 ruby​​ 版本 1.9.2 irb 中工作得很好: 5.times { puts rand(20) }
  • 这是一个关于像你这样的话题的讨论:github.com/thoughtbot/factory_girl/issues/229 你可以尝试调用 Kernel.rand() 而不是 rand() 吗?

标签: ruby factory-bot ruby-1.9


【解决方案1】:

在最新版本的 factory_girl 中,使用 instance_eval 定义不带块参数的属性,它假定裸方法调用正在查找先前的属性定义、模型上的方法或语法方法,如“create”或“build”。

为了使“open”或“file”等属性正常工作,代理对象取消定义了大多数私有方法,包括“rand”。这意味着您需要使用“Kernel.rand”而不仅仅是“rand”。

相关来源可以看这里:https://github.com/thoughtbot/factory_girl/blob/master/lib/factory_girl/evaluator.rb#L16

【讨论】:

    猜你喜欢
    • 2011-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    相关资源
    最近更新 更多