Ruby:不允许在’yield’之后放入空格

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

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

虽然这段代码可以在yield之后拥有尽可能多的空格,但我想:

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

解决方法

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

以此为例:

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

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

以上输出’foobar’如预期.

def foo
    yield ('foo',y }

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

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

这是合法的:

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 }

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...