Ruby多行块无需结束

Ada*_*kis 20 ruby

我是Ruby的初学者,所以我很遗憾地问这么简单,但是这个代码有什么问题 -

3.upto(9) {
  print "Hello"
  puts " World"
}
Run Code Online (Sandbox Code Playgroud)

要么

3.upto(9) { |n|
  print "Hello "
  puts n
}
Run Code Online (Sandbox Code Playgroud)

它工作得很好,但我看到的大多数代码示例使用的语法

3.upto(9) do |n|
  print "Hello "
  puts n
end
Run Code Online (Sandbox Code Playgroud)

仅仅是对单个语句使用花括号的约定吗?来自C/C#第一个对我来说似乎更自然,但在罗马时!

Bri*_*ell 45

两种语法之间存在细微差别.{ }优先级高于do ... end.因此,以下将通过bar和块方法foo:

foo bar do ... end
Run Code Online (Sandbox Code Playgroud)

而以下将传递一个块bar,并将其结果传递给foo:

foo bar { ... }
Run Code Online (Sandbox Code Playgroud)

因此,您的示例将采取相同的行动.但是,如果您将括号括起来:

> 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
Run Code Online (Sandbox Code Playgroud)

所以,{ }如果你在Ruby中省略括号,那么你更有可能抓住你,这是相当普遍的; 由于这个原因,并且因为Ruby条件和其他控件构造都end用作分隔符,人们通常使用do ... end在语句末尾出现的多行代码块.

但是,{ }经常在do ... end繁琐的地方使用,例如,如果你将几个方法链接在一起就会占用块.这可以让你编写一个简短的一行小块,可以用作方法链的一部分.

> [1,2,3].sort{|x,y| y<=>x}.map{|x| x+1}
=> [4, 3, 2]
Run Code Online (Sandbox Code Playgroud)

这是一个说明这种差异的例子:

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
Run Code Online (Sandbox Code Playgroud)


sep*_*p2k 7

这只是惯例.