【问题标题】:Ruby "each" method [duplicate]Ruby“每个”方法[重复]
【发布时间】:2014-08-12 05:02:19
【问题描述】:

为什么下面的方法返回的不是字符串的长度,而是字符串?

def length_finder(input_array)
  lengths = []
  input_array.each do |string|
    lengths << string.length
  end
end

>> array = %w{ lol testtest l}
=> ["lol", "testtest", "l"]
>> length_finder(array)
=> ["lol", "testtest", "l"]

我期待看到的:

>> length_finder(array)
=> [3, 8, 1]

这是来自rubymonk.com的练习

【问题讨论】:

    标签: ruby arrays iterator


    【解决方案1】:

    试试这个代码。

    def length_finder(input_array)
      lengths = []
      input_array.each do |string|
        lengths << string.length
      end
      return lengths
    end
    

    您需要编写“返回长度”,因为 Ruby 方法返回最后评估的表达式。

    map 方法返回编辑后的数组。下面的代码更简单。

    def length_finder(input_array)
      input_array.map {|item| item.length}
    end
    

    【讨论】:

    • 注意你可以把input_array.map {|item| item.length}写成input_array.map(&amp;:length)
    【解决方案2】:

    因为each返回接收者input_array,这是一个字符串数组。

    【讨论】:

    • 但是lengthseach 返回的结果无关。我仍然不明白为什么lengths &lt;&lt; string.length 行没有按照我的预期进行
    • 它正在做你期望做的事情。在最后一个“结束”之前添加长度,该变量将被返回。
    • 没错。 lengthseach 返回的内容无关。你期望lengths &lt;&lt; string.length 做什么?
    【解决方案3】:

    以“input_array.each”开头的行上的缩进表示“end”语句与 .each 方法联系在一起。因为它是在缩进较少的范围内定义的,所以 lengths 仍然由缩进最多的行填充,

    lengths << string.length
    

    然而,Ruby 解析器认为函数的最后一行是返回语句:“end”指的是 .each 方法,它返回一个字符串数组。

    即使 lengths[] 数组与您现在想要的完全一样,last 行也需要直接引用您要返回的变量。 “end”是指上面要返回的对象的行。

    【讨论】:

      猜你喜欢
      • 2011-07-17
      • 2012-07-19
      • 2013-03-07
      • 1970-01-01
      • 2021-05-27
      • 2018-03-19
      • 1970-01-01
      • 1970-01-01
      • 2013-12-08
      相关资源
      最近更新 更多