如何在Ruby中的一行中执行多个后续函数?

时间:2010-06-04 02:34:40

标签: ruby function shortcut

我有两个具有相同条件的后续功能,我想知道写这个的最佳方法是什么?我知道这样做的一种方法是使用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

4 个答案:

答案 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

所以,整个循环完全没必要开始。