gpt4 book ai didi

ruby - Ruby for 循环的最佳实践

转载 作者:数据小太阳 更新时间:2023-10-29 07:03:08 24 4
gpt4 key购买 nike

我遇到了三种编写循环的方法。

the_count = [1, 2, 3, 4, 5]
  • for 循环 1

    for number in the_count
    puts "This is count #{number}"
    end
  • for 循环 2

    the_count.each do |count|
    puts "The counter is at: #{count}"
    end
  • for 循环 3

    the_count.each {|i| puts "I got #{i}"}

是否存在一种方法比其他两种方法更好的做法或更好的解决方案?第一个与其他语言的最相似,对我来说,第三个看起来很乱。

最佳答案

通常不鼓励第一种选择。 ruby 可能对来自其他语言的开发人员更友好(因为他们识别语法),但它在变量可见性方面表现得有点奇怪。通常,您应该在任何地方都避免使用这种变体,并且只使用其中一种 block 变体。

其他两个变体的优点是它对所有接受 block 的方法都一样,例如mapreducetake_while 等。

底部的两个变体大部分是等效的 您使用 each 方法并为它提供一个 block 。 each 方法为数组中的每个元素调用一次 block 。

您使用哪一个主要取决于偏好。对于不需要换行的简单 block ,大多数人倾向于使用带大括号的。如果你想在你的 block 中使用换行符,例如如果那里有多个语句,则应使用 do...end 变体。这使您的代码更具可读性。

关于何时应该使用其中一种或另一种,还有其他稍微微妙的意见(例如,有些人在编写功能 block 时总是使用大括号形式,即即使它们更长也不会影响 block 的外部) ,但如果您遵循上述建议,至少 98% 的 ruby​​ 开发人员会阅读您的代码。

因此,总而言之,避免使用 for i in ... 变体(对于 whileuntil、... ) 并始终使用 block 形式。对复杂的 block 使用 block 的do...end,对简单的单行 block 使用大括号形式。

当您使用 block 形式时,您应该注意链接方法时优先级的细微差别。

这个

foo bar { |i| puts i }

相当于

foo(bar{|i| puts i})

同时

foo bar do |i|
puts i
end

相当于

foo(bar) { |i| puts i }

如您所见,在大括号形式中, block 被传递给最右边的方法,而在 do...end 形式中, block 是传递给最左边的方法。不过,您始终可以用括号解决歧义。

关于ruby - Ruby for 循环的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31263558/

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