假设我想以这种方式随机索引访问数组元素:
[1, 2, 3, 4].at(rand(4))
有没有办法传递数组的大小,如下所示?
[1, 2, 3, 4].at(rand(le_object.self.size))
为什么我会这样做? - 一位伟大的人曾经说过: 科学不是为什么,而是为什么不是。
答案 0 :(得分:4)
不,你不能这样做。调用站点上的某些特殊名称无法访问方法(该阵列)的接收方。最好的办法是为该对象指定一个名称。
ary = [1, 2, 3, 4]
ary.at(rand(ary.size))
当然,如果您只需要一个随机元素,那么应该使用.sample
。这不需要在调用站点评估任何参数,其self
是数组。
答案 1 :(得分:4)
不推荐,但instance_eval
会以某种方式运作:
[1, 2, 3, 4].instance_eval { at(rand(size)) }
[1, 2, 3, 4].tap { |a| break a.at(rand(a.size)) }
有一个开放的feature request来添加一个产生self
的方法并返回该块的结果。如果它成为Ruby,你可以写:
[1, 2, 3, 4].insert_method_name_here { |a| a.at(rand(a.size)) }
答案 2 :(得分:2)
您可以使用instance_eval
通过绑定数组变量
[1, 2, 3, 4].instance_eval { at(rand(size)) }
假设您对随机元素感兴趣,因为Array#at
返回给定索引处的元素,您可以使用Array#sample
从数组中选择一个随机元素。
[1,2,3,4].sample
#=> 3
如果您不想使用instance_eval
(或任何形式的eval
),那么,您可以通过猴子修补向Array
课程添加方法 - 一般来说,我是不确定是否一个明智的想法,但是
class Array
def random_index
rand(size)
end
end
["a","b","c","d"].random_index
#=> 2
答案 3 :(得分:1)
你可以用lambda做类似的事情:
getrand = ->(x) { x[rand(x.count)] }
getrand.call [1,2,3]
# => 2