[英]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.