Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Ruby中创建一个取数组平均值的函数?_Ruby - Fatal编程技术网

如何在Ruby中创建一个取数组平均值的函数?

如何在Ruby中创建一个取数组平均值的函数?,ruby,Ruby,我试过这样的方法: def average_array_float(&array) array.inject{ |sum, el| sum + el }.to_f / array.size end 没有成功 array = [1, 2, 3] def even_numbers(array) array.select { |num| num.even? } end p array.even_numbers 答复: $ bundle exec ruby main.rb Tra

我试过这样的方法:

def average_array_float(&array)
  array.inject{ |sum, el| sum + el }.to_f / array.size
end
没有成功

array = [1, 2, 3]

def even_numbers(array)
  array.select { |num| num.even? }
end

p array.even_numbers
答复:

$ bundle exec ruby main.rb
Traceback (most recent call last):
main.rb:7:in `<main>': private method `even_numbers' called for [1, 2, 3]:Array (NoMethodError)
exit status 1
$bundle exec ruby main.rb
回溯(最近一次呼叫最后一次):
main.rb:7:in`':为[1,2,3]:数组(NoMethodError)调用的私有方法“偶数”
退出状态1
我做错了什么?

必须将数组传递给方法:

def even_numbers(array)
  array.select { |num| num.even? }
end

array = [1, 2, 3, 4, 5, 6]
even_numbers(array)
#=> [2, 4, 6]
发生示例中的
NoMethodError
是因为如果在顶级定义方法,它将成为
对象的私有方法:

Object.private_methods
#=> [:initialize, :inherited, :method_added, :method_removed, :method_undefined,
#    :remove_const, :initialize_copy, :initialize_clone, :using, :public,
#    :ruby2_keywords, :protected, :private, :included, :extended, :prepended,
#    :even_numbers, :sprintf, :format, ...]
#    ^^^^^^^^^^^^^
由于
数组
是一个
对象
,因此它可以(私下)访问该方法

如果确实要将方法添加到
数组
,可以打开相应的类:

class Array
  def even_numbers
    select { |num| num.even? }
  end
end
这给了你:

[1, 2, 3, 4, 5, 6].even_numbers
#=> [2, 4, 6]
然而,尽管这是可行的,但不建议修改非您自己的对象,更不用说Ruby的核心类了


关于其他方法,您可以使用和:

或者,如果您喜欢精确的结果:

def average(array)
  array.sum.quo(array.size)
end

average([1, 2, 4])
#=> (7/3)

你好有关Stackoverflow的问题应采用英语。请改掉它。好的!我忘了。翻译我认为你应该包括完整的代码,包括类(如果存在)和偶数方法
def average(array)
  array.sum.quo(array.size)
end

average([1, 2, 4])
#=> (7/3)