如何自动增加一个变量,每次使用它时,它会加1,从0开始?
例如:
i = i+1 || 0
arr[i] = "foo"
arr[i] = "bar"
arr[i] = "foobar"
arr #=> ["foo","bar","foobar"]
我为nil获得NoMethodError
未定义的方法'+':NilClass
答案 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"]
或者,使用<<
运算符动态追加,其他答案推荐。