[英]Static local variables for methods in Ruby?
我有这个:
def valid_attributes
{ :email => "some_#{rand(9999)}@thing.com" }
end
对于Rspec测试吧? 但我想做这样的事情:
def valid_attributes
static user_id = 0
user_id += 1
{ :email => "some_#{user_id}@thing.com" }
end
我不希望user_id
可以从任何地方访问,但是这个方法,这可以用Ruby吗?
这是一个封闭案例。 尝试这个
lambda { user_id = 0 self.class.send(:define_method, :valid_attributes) do user_id += 1 { :email => "some_#{user_id}@thing.com" } end }.call
在lambda中包装所有内容允许lambda中定义的变量仅存在于范围中。 您也可以添加其他方法。 祝好运!
这个答案的范围比你的问题要大一些,但我认为它是你想要做的事情的根源,并且将是最容易和最易维护的。
我认为你真正想要的是工厂。 尝试使用像factory_girl这样的东西,这将使很多测试变得更容易。
首先,您要设置工厂来创建您正在测试的任何类型的对象,并使用序列作为电子邮件属性:
FactoryGirl.define do
factory :model do
sequence(:email) {|n| "person#{n}@example.com" }
# include whatever else is required to make your model valid
end
end
然后,当您需要有效属性时,您可以使用
Factory.attributes_for(:model)
您还可以使用Factory.create
和Factory.build
创建模型的已保存和未保存实例。
你可以使用一个闭包:
def validator_factory
user_id = 0
lambda do
user_id += 1
{ :email => "some_#{user_id}@thing.com" }
end
end
valid_attributes = validator_factory
valid_attributes.call #=> {:email=>"some_1@thing.com"}
valid_attributes.call #=> {:email=>"some_2@thing.com"}
这样, user_id
将无法在外部访问。
我使用了一个实例变量:
def valid_attributes
@user_id ||= 0
@user_id += 1
{ :email => "some_#{@user_id}@thing.com" }
end
Ruby拥有的唯一变量是局部变量,实例变量,类变量和全局变量。 它们都不适合你所追求的。
您可能需要的是存储user_id的单例,并且每次都会为您提供一个新的ID号。 否则,您的代码将不是线程安全的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.