簡體   English   中英

Ruby中方法的靜態局部變量?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM