加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

在Ruby中,为什么在使用“do”和“end”时,方法调用不能被视为单

发布时间:2020-12-16 22:20:10 所属栏目:百科 来源:网络整理
导读:以下问题与“ Ruby Print Inject Do Syntax”问题有关.我的问题是,我们可以坚持使用do和end,并使其与put或p一起工作吗? 这样做: a = [1,2,3,4]b = a.inject do |sum,x| sum + xendputs b # prints out 10 所以说,注意是Array对象的一个??实例方法,而这个实
以下问题与“ Ruby Print Inject Do Syntax”问题有关.我的问题是,我们可以坚持使用do和end,并使其与put或p一起工作吗?

这样做:

a = [1,2,3,4]

b = a.inject do |sum,x|
  sum + x
end
puts b   # prints out 10

所以说,注意是Array对象的一个??实例方法,而这个实例方法接受一个代码块,然后返回一个数字.如果是这样,那么调用函数或方法并返回一个返回值是没有什么不同的:

b = foo(3)
puts b

要么

b = circle.getRadius()
puts b

在上述两种情况下,我们可以直接说

puts foo(3)
puts circle.getRadius()

所以没有办法通过使用以下两种方法直接使其工作:

a = [1,4]

puts a.inject do |sum,x|
  sum + x
end

但它给了

ch01q2.rb:7:in `inject': no block given (LocalJumpError)
        from ch01q2.rb:4:in `each'
        from ch01q2.rb:4:in `inject'
        from ch01q2.rb:4

对方法调用using()进行分组不起作用:

a = [1,4]

puts (a.inject do |sum,x| 
        sum + x   
      end)

这给出:

ch01q3.rb:4: syntax error,unexpected kDO_BLOCK,expecting ')'
puts (a.inject do |sum,x|
                 ^
ch01q3.rb:4: syntax error,unexpected '|',expecting '='
puts (a.inject do |sum,x|
                          ^
ch01q3.rb:6: syntax error,unexpected kEND,expecting $end
      end)
         ^

最后,以下版本的作品:

a = [1,4]

puts a.inject { |sum,x|
    sum + x
}

但是为什么方法调用using()的分组在前面的例子中有效?如果一个程序员坚持他使用和结束,该怎么办?

解决方法

从(非官方) ruby grammar,我们看到put(…)中的(…)的内容必须是CALL_ARGS,它不直接减少到STMT.但是,它们可以减少到'(‘COMPSTMT’)’.通过添加一组额外的括号,可以使用do … end.
a = [1,4]

puts ((a.inject do |sum,x| 
         sum + x   
       end))

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读