我有两个具有相同条件的后续功能,我想知道写这个的最佳方法是什么?我知道这样做的一种方法是使用if(条件)...结束,但我想知道我是否可以在类似于bash的单行中进行,'[$ n == $ value] echo“$ n “&&断”。
n = 0
loop do
puts n if n == value # puts and break is having the same condition, but
break if n == value # can we do it in one line?
n += 1
end
答案 0 :(得分:4)
因为n是真的,你可以使用'和'木匠。它读得非常好:
n = 0
loop do
puts n and break if n == value
n += 1
end
<强> - 编辑 - 强>
正如评论中指出的那样,这实际上不会起作用,因为puts返回nil,这不是真的。我的错。您可以使用'或'代替,但这不能很好地阅读。所以我只想用括号对语句进行分组。
n = 0
loop do
(puts n; break) if n == value
n += 1
end
您也可以更改puts方法以返回它打印的值,这可以使用'和',但这可能不是最聪明的想法:)
我猜你的实际代码与你粘贴的代码有所不同,所以如果链中的第一个方法返回一些东西,你可以使用'和'。
答案 1 :(得分:1)
一种简单的方法就是将语句括起来:
ruby-1.9.1-p378 > 0.upto(5) do |n|
ruby-1.9.1-p378 > (puts n; break;) if n == 3
ruby-1.9.1-p378 ?> puts ">>#{n}<<"
ruby-1.9.1-p378 ?> end
>>0<<
>>1<<
>>2<<
3
如果放在括号中有点多,那么一个开头就可以了:
0.upto(5) do |n|
begin
puts "I found a matching n!"
puts n
puts "And if you multiply it by 10, it is #{10*n}"
break;
end if n == 3
puts "((#{n}))"
end
输出:
((0)) ((1)) ((2)) I found a matching n! 3 And if you multiply it by 10, it is 30
答案 2 :(得分:0)
proc { puts n; break; }.() if n == 3
答案 3 :(得分:0)
Ruby的一个重要规则是,如果你正在编写循环,那么你可能做错了。在这种特殊情况下,循环所做的就是在集合中查找元素。在Ruby中,已经有 用于查找集合中元素的方法:Enumerable#find
。没有必要自己编写。
因此,代码被简化为:
puts (0...1.0/0).find {|n| n == value }
现在我们对这个问题进行了很好的声明性表达,很容易看出(假设理性的语义和value.to_s
的理智语义),这与:
puts value
所以,整个循环完全没必要开始。