通过参数

时间:2015-12-17 15:49:57

标签: ruby

假设我想以这种方式随机索引访问数组元素:

[1, 2, 3, 4].at(rand(4))

有没有办法传递数组的大小,如下所示?

[1, 2, 3, 4].at(rand(le_object.self.size))

为什么我会这样做? - 一位伟大的人曾经说过: 科学不是为什么,而是为什么不是。

4 个答案:

答案 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)) }

您还可以break中的tap

[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通过绑定数组变量

来执行ruby代码
[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