我是
Ruby的初学者,所以我很抱歉问一些这么简单,但是这个代码有什么问题吗?
3.upto(9) { print "Hello" puts " World" }
要么
3.upto(9) { |n| print "Hello " puts n }
它工作得很好,但我看到的大多数代码示例使用的语法
3.upto(9) do |n| print "Hello " puts n end
仅仅使用花括号用于单个语句的惯例呢?来自C/C++#第一个似乎对我来说比较自然,但在罗马时!
解决方法
两种语法之间存在微妙的区别. {}的优先级高于…结束.因此,以下将通过bar和block到方法foo:
foo bar do ... end
而以下将通过一个块到bar,其结果是foo:
foo bar { ... }
所以你的例子将是一样的.但是,如果你离开括号:
> 3.upto 9 { puts "Hi" } SyntaxError: compile error (irb):82: Syntax error,unexpected '{',expecting $end 3.upto 9 { ^ from (irb):82 from :0 > 3.upto 9 do puts "Hi" end Hi Hi Hi Hi Hi Hi Hi => 3
所以,{}如果你在Ruby中留下括号,这是比较常见的,那么{}更有可能吸引你.因为这个原因,由于Ruby条件和其他控制结构都使用end作为分隔符,所以人们通常使用do … end来处理语句结尾处的多行代码块.
然而,{}经常用于那些结束是麻烦的地方,例如,如果你连在一起的几个方法.这可以让您编写一个可以用作方法链一部分的简短的一行小块.
> [1,2,3].sort{|x,y| y<=>x}.map{|x| x+1} => [4,3,2]
以下是一个例子来说明这一点:
def foo arg if block_given? puts "Block given to foo" yield arg else puts "No block given to foo" arg end end def bar if block_given? puts "Block given to bar" yield "Yielded from bar" else puts "No block given to bar" end "Returned from bar" end irb(main):077:0> foo bar { |arg| puts arg } Block given to bar Yielded from bar No block given to foo => "Returned from bar" irb(main):078:0> foo bar do |arg| puts arg end No block given to bar Block given to foo Returned from bar => nil