【问题标题】:Ruby each block, does not return valueRuby每个块,不返回值
【发布时间】:2017-11-07 15:01:21
【问题描述】:

以下代码不起作用,问题出在 calc_fitness 方法内部,每个块都没有返回值,我不知道为什么

# takes an array, splices them into groups of 2 and returns a sum of values read from the matrix
def calc_fitness(hypothesis_arr)
   hypothesis_arr.each_slice(2).to_a.map{|v| $distances[v.first,v.last]}
end

def main

  # filling the matrix, with random values
  $distances = create_sym_matrix
  p calc_fitness((0..99).to_a) 
end

main
# => [67,67,67,67....67,] #these should not be the same, which means i  the block alway returns the same value. Why?

【问题讨论】:

  • ruby 中的所有内容都返回一个值。恰好 main 的返回值是 nil,因为来自 hypothesis_arr.each_slice(2).each{|v| $distances[v.first,v.last]} 的返回值是 nil。您可以通过 (0..99).to_a.each_slice(2).each{} #=> nil 重新创建它
  • 在使用像$distances 这样的全局变量时要格外小心,这就是$ 前缀的含义。这些可以使其他普通代码在匆忙中完全无法维护。同样,没有理由使用main 方法,Ruby 已经为此目的提供了main 上下文,即任何类、模块或方法定义之外的代码。

标签: ruby each block


【解决方案1】:

发生这种情况是因为 each 返回自身(Enumerator 的一个实例)而 each_slice 返回 nil。

https://ruby-doc.org/core/Enumerable.html#method-i-each_slice

您可以尝试将each 更改为map

为了简化和直观了解生成的内容,我使用了:

(1..99).to_a.each_slice(2).map { |v| { first: v.first, last: v.last } }
=> [{:first=>1, :last=>2}, {:first=>3, :last=>4}, {:first=>5, :last=>6}, {:first=>7, :last=>8}, {:first=>9, :last=>10}, {:first=>11, :last=>12}, {:first=>13, :last=>14}, {:first=>15, :last=>16}, {:first=>17, :last=>18}, {:first=>19, :last=>20}, {:first=>21, :last=>22}, {:first=>23, :last=>24}, {:first=>25, :last=>26}, {:first=>27, :last=>28}, {:first=>29, :last=>30}, {:first=>31, :last=>32}, {:first=>33, :last=>34}, {:first=>35, :last=>36}, {:first=>37, :last=>38}, {:first=>39, :last=>40}, {:first=>41, :last=>42}, {:first=>43, :last=>44}, {:first=>45, :last=>46}, {:first=>47, :last=>48}, {:first=>49, :last=>50}, {:first=>51, :last=>52}, {:first=>53, :last=>54}, {:first=>55, :last=>56}, {:first=>57, :last=>58}, {:first=>59, :last=>60}, {:first=>61, :last=>62}, {:first=>63, :last=>64}, {:first=>65, :last=>66}, {:first=>67, :last=>68}, {:first=>69, :last=>70}, {:first=>71, :last=>72}, {:first=>73, :last=>74}, {:first=>75, :last=>76}, {:first=>77, :last=>78}, {:first=>79, :last=>80}, {:first=>81, :last=>82}, {:first=>83, :last=>84}, {:first=>85, :last=>86}, {:first=>87, :last=>88}, {:first=>89, :last=>90}, {:first=>91, :last=>92}, {:first=>93, :last=>94}, {:first=>95, :last=>96}, {:first=>97, :last=>98}, {:first=>99, :last=>99}]

现在我不确定分配给$distances 的那个函数在做什么。您可能需要为此提供代码或提供有关您尝试完成的任务的更多详细信息。

【讨论】:

  • 你是对的,我把它改了,现在问题不同了。上面会解释
  • 更新了我的回复,我还注意到你在地图之前有另一个 to_a。你不应该需要那个。
  • 矩阵只包含随机值
  • 实际上,each 按惯例返回self,但each_slice 返回nil 是对的。
  • 所以map函数只返回第一个值,作为数组
猜你喜欢
  • 2023-03-03
  • 1970-01-01
  • 2013-11-10
  • 1970-01-01
  • 2010-12-26
  • 2021-10-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-08
相关资源
最近更新 更多