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。
这应该看到广泛使用? 我不知道。 但是很有趣!