如何用不同的参数映射 - 红宝石

时间:2017-04-15 23:17:07

标签: arrays ruby

我正在创建一些测试,我想创建一个将不同参数传递给构造函数的对象数组,是否有一种聪明的方法呢?

例如,假设我有这段代码:

 foos = 3.times.map{ Foo.new("a") }

此代码会为我提供一个包含3个foo的数组,但所有数组都使用"a"参数初始化。

我宁愿有一个数组,其中第一个用"a"初始化,第二个用"b"初始化,第三个用"c"初始化,就像这样做:

foos = [Foo.new("a"),Foo.new("b"),Foo.new("c")]

有更聪明的方法吗?

3 个答案:

答案 0 :(得分:3)

试试这个

%w(a b c) 

如果您不知道

["a", "b", "c"]

是一种较短的说法

a = [[2.802, 4.713, 9.581, 15.339, 22.273],
     [np.nan, 7.647, 5.559, 7.317, 10.250],
     [np.nan, np.nan, 5.383, 0.184, -0.882],
     [np.nan, np.nan, np.nan, -3.992, -11.124],
     [np.nan, np.nan, np.nan, np.nan, -20.192]]
b = np.nanmin(a, axis=0)
b
array([  2.802,   4.713,   5.383,  -3.992, -20.192])

答案 1 :(得分:3)

更深入地了解您的问题,我将建议您使用两个库:Factory GirlFaker。没有Rails或Rspec特定。

使用Factory Girl,您可以定义工厂来创建测试数据,使用Faker,您可以将随机数据与工厂相关联。

我建议使用这两个库,因为为简单用例创建测试数据很容易,但是当对象之间的关系更复杂时,它会变得非常复杂。

这是一个让你入门的例子:

class Foo < Struct.new(:bar)
end

FactoryGirl.define do
  factory :foo do
    bar Faker::Number.digit
  end
end

FactoryGirl.build_list(:foo, 3)
=> [#<struct Foo bar=3>, #<struct Foo bar=2>, #<struct Foo bar=7>]

FactoryGirl.build(:foo)
=> #<struct Foo bar=5>

    FactoryGirl.build(:foo, bar: 2)
=> #<struct Foo bar=2>

以下是关于Factory Girl有多强大的more examples。请记住,您需要使用build*方法而不是create*方法,因为create*方法在将save方法与持久层一起使用时也会调用数据来保留数据。

答案 2 :(得分:2)

提供替代方案:

arr = ['a', 'b', 'c']
Array.new(arr.size) { |i| Foo.new arr[i] }
#=>
#[#<Foo:0x000000025db798 @arg="a">,
# #<Foo:0x000000025db748 @arg="b">,
# #<Foo:0x000000025db6d0 @arg="c">]