2012-03-12 54 views
4

我将代码库从1.8升级到1.9。我在我的代码中遇到了几个地方(只有规格说明,不知道这是否是巧合),在没有变量的块出现问题的地方。给他们一个虚拟变量可以解决问题。这里有一个例子:Ruby 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 

这是怎么回事?

+2

lambda表达式,特效,和阻止所有不同的表现在Ruby中,所以请一定要指定正确的,而不是交换他们。我相信你的意思是* blocks *,而不是Procs/lambda。 – 2012-03-12 22:42:07

+0

哎呀 - 是的,我知道,只是读了一些关于lambdas的东西,并将它放在大脑上:D现在修复了 – 2012-03-12 22:45:10

+1

这与Factorygirl有一定关系。例如,从我的ruby版本1.9.2开始,这工作得很好irb:5.times {puts rand(20)} – kclair 2012-03-12 23:19:08

回答

2

在factory_girl的最新版本中,定义一个没有block参数的属性使用instance_eval,它假定裸方法调用正在寻找以前的属性定义,模型上的方法或类似“create”或“build”的语法方法。 “

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

你可以看到相关的源位置:https://github.com/thoughtbot/factory_girl/blob/master/lib/factory_girl/evaluator.rb#L16