Ruby多行块没有做结束

我是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#的第一个看起来对我来说更自然,但是在罗马时!

这两种语法之间有细微的差别。 { }优先级比do ... end高。 因此,下面的方法将通过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来结束语句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 

这只是惯例。

有无缝的 从README

Python允许你用缩进来表示代码块的结束。 Ruby遭受了一个非常冗长冗长的块终止符,“结束”。 很像Lisps最后会有几十个关系,使用模块和类的Ruby文件最终会导致大量的“结束”,而这些并不是必需的。

编写一个Ruby文件,但跳过所有的“结束”。 将你的代码块排成像Python一样。 然后把它称为'your_file.rbe',要求'无缝',并要求'your_file'。 无缝做rest。

这应该看到广泛使用? 我不知道。 但是很有趣!