gpt4 book ai didi

ruby - 如何在不获取 undefined variable 的情况下在 Ruby 中使用 reduce/inject

转载 作者:太空宇宙 更新时间:2023-11-03 17:29:52 26 4
gpt4 key购买 nike

当使用累加器时,累加器是仅存在于 reduce block 中还是存在于函数中?

我有一个看起来像这样的方法:

 def my_useless_function(str)
crazy_letters = ['a','s','d','f','g','h']
str.split.reduce([]) do |new_array, letter|
for a in 0..crazy_letters.length-1
if letter == crazy_letters[a]
new_array << letter
end
end
end

return true if (new_array == new_array.sort)
end

当我执行这段代码时出现错误

"undefined variable new_array in line 11 (the return statement)"

我还尝试将 new_array 值分配给另一个变量作为 reduce block 中的 else 语句,但这给了我相同的结果。

有人可以向我解释为什么会这样吗?

最佳答案

问题是 new_array 是在调用 reduce 时创建的,然后引用就丢失了。 Ruby 中的局部变量的范围限定为它们所在的 block 。在您的情况下,该数组可以从 reduce 返回,因此您可以在那里使用它。但是,您需要解决一些问题:

  • str.split 在 Ruby 2+ 中不会将字符串拆分为字符。您应该使用 str.charsstr.split('')
  • reduce 的每次新迭代所保留的对象必须通过每次从 block 中返回来保留。最简单的方法是将 new_array 作为 block 中的最后一个表达式。

因此:

def my_useless_function(str)
crazy_letters = ['a','s','d','f','g','h']
crazy_only = str.split('').reduce([]) do |new_array, letter|
for a in 0..crazy_letters.length-1
if letter == crazy_letters[a]
new_array << letter
end
end
new_array
end

return true if (crazy_only == crazy_only.sort)
end

请注意,您的功能不是很有效,也不是很地道。这是该函数的一个较短的版本,它更惯用,但效率并不高:

def my_useless_function(str)
crazy_letters = %w[a s d f g h]
crazy_only = str.chars.select{ |c| crazy_letters.include?(c) }
crazy_only == crazy_only.sort # evaluates to true or false
end

这是一个更高效的版本:

def efficient_useless(str)
crazy_only = str.scan(/[asdfgh]/) # use regex to search for the letters you want
crazy_only == crazy_only.sort
end

关于ruby - 如何在不获取 undefined variable 的情况下在 Ruby 中使用 reduce/inject,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43811265/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com