Ruby:不允许在产生'之后放空格。

时间:2014-04-17 17:22:37

标签: ruby yield parentheses

如果我传递的参数在括号中,是否有理由在 yield 关键字后不允许空格?这段代码会收集一个错误:

def who_says_what
yield ("rose","yay")
end
who_says_what {|flower,speech| puts "#{flower} says #{speech}"}

虽然这段代码在收益后可以有多个空格,但我想:

def who_says_what
yield "rose","yay"
end
who_says_what {|flower,speech| puts "#{flower} says #{speech}"}

1 个答案:

答案 0 :(得分:5)

yield关键字的行为与方法调用语法没有区别。如果方法名和包含方法参数的括号之间有空格,则解释器将括号解析为传递单个参数,该参数是括号内表达式的结果。

以此为例:

def foo
    yield('foo', 'bar')
end

foo {|x, y| print x, y }

以上输出' foobar'如预期的那样。

def foo
    yield ('foo', 'bar')
end

foo {|x, y| print x, y }

因为调用方法的括号是可选的并且预期会紧跟名称(或者在这种情况下为yield关键字),所以这里只使用一个参数调用块:表达式('foo', 'bar')

但是,此表达式中的逗号是意外的,您将获得SyntaxError异常。您可以通过尝试评估('foo', 'bar')中的表达式irb来更简单地复制相同的错误。

这是合法的:

def foo
    yield ('foobar')
end

foo {|x| puts x }

正确打印' foobar'因为表达式('foobar')的结果是'foobar',那就是传递给块的参数。

同样,这会打印4和8,正如人们所期望的那样:

def foo
    yield (2+2), (4+4)
end

foo {|x, y| puts x; puts y }