Ruby中的自动增量变量

时间:2013-12-31 02:14:31

标签: ruby variables

如何自动增加一个变量,每次使用它时,它会加1,从0开始?

例如:

i = i+1 || 0 

arr[i] = "foo"
arr[i] = "bar"
arr[i] = "foobar"

arr #=> ["foo","bar","foobar"]

我为nil获得NoMethodError 未定义的方法'+':NilClass

4 个答案:

答案 0 :(得分:4)

变量只是一个名称。它没有行为。如果您想要行为,请使用方法:

def i
  @i ||= -1
  @i += 1
end

arr = []

arr[i] = 'foo'
arr[i] = 'bar'
arr[i] = 'foobar'

arr #=> ['foo', 'bar', 'foobar']

可替换地:

_i = -1

define_method(:i) do
  _i += 1
end

arr = []

arr[i] = 'foo'
arr[i] = 'bar'
arr[i] = 'foobar'

arr #=> ['foo', 'bar', 'foobar']

但实际上,你所拥有的只是一种非常复杂的说法

arr = %w[foo bar foobar]

更清楚。

答案 1 :(得分:2)

你做不到。没有办法将变量与行为联系起来 - 事​​实上,除了只是以明显的方式阅读和设置它们之外,用局部变量做任何事情在标准Ruby中几乎是不可能的 - 并且整数不能改变价值。

但是,如果你真的希望用数组做这样的事情,你可以使用<<运算符推送到数组的末尾:

arr = []
arr << "foo"
arr << "bar"
arr << "foobar"

arr #=> ["foo","bar","foobar"]

答案 2 :(得分:2)

其他答案非常好。我想添加几种方法来实现它。

您可以使用Proc:

i = -1
next_i = Proc.new { i += 1 }
next_i.call  # => 0
next_i.call  # => 1

您可以使用枚举器:

ids = Enumerator.new { |y| i = -1; loop { y << (i+=1) } }
ids.next     # => 0
ids.next     # => 1

如果你的应用程序中的id来自某个更大的对象是有意义的,你可以在这个对象中定义一个方法,如下所示:

def next_id
  @i ||= -1
  @i += 1
end

答案 3 :(得分:1)

这似乎就像你尝试那样做,但我不推荐它:

ary = []
i = -1
ary[i += 1] = 'foo'
ary[i += 1] = 'bar'
ary # => ["foo", "bar"]

相反,做一些惯用的和期望的事情并以这些方式之一分配给数组:

ary = ['foo', 'bar']
ary = %w[foo bar]
ary # => ["foo", "bar"]

或者,使用<<运算符动态追加,其他答案推荐。