【问题标题】:What happens when method name and block name are same?当方法名和块名相同时会发生什么?
【发布时间】:2015-04-04 22:42:51
【问题描述】:

我正在尝试理解以下行为:

def test
  puts "In Method"
end

test
#=> In Method

test {puts "In Block" }
#=> In Method

我的解释是 test 是一种方法,我将 {puts "In Block"} 作为参数传递给该方法。由于该方法不使用参数,因此它打印默认的"In Method"。对吗?

我们如何区分块调用和方法调用? test {puts "In Block"} 也可以被解释为一个块吗? yield 是执行代码块的唯一方法吗?

【问题讨论】:

  • 标题看起来与问题无关。
  • 我猜你已经编辑过了!谢谢。
  • 我更正了标题中的语法错误,但保持原样。你应该纠正它。

标签: ruby codeblocks yield


【解决方案1】:

正如sawa 所描述的,为什么"In Method" 会按照其在方法中的定义打印。如果要将参数传递给方法,则必须初始化参数以接受参数。

像这样..

def test message
  puts "I am in method"
  puts message
end

test("In Block")

注意:方法不接受块作为参数。请通过此参考链接,通过示例了解所有语法: Ruby Programming/Syntax/Method Calls

【讨论】:

  • 虽然方法名和括号之间的空格在这里最终是正确的,但它应该被删除,因为它可能会误导新的 Rubyists。
  • 空白已被删除...这是拼写错误
  • 我担心我错过了什么。 putsanything 返回nil,它作为参数传递给test。这有什么意义?
  • OP 通过了{block};你通过了(argument)。当参数是一个表达式时(例如(puts "In Block")),表达式在传递之前当然会被计算,所以nil是在打印"In Block"之后传递的。这是你的意图吗?
  • 答案已更新,我认为它不会返回 nil
【解决方案2】:

由于该方法不使用[块],它正在打印默认的“In Method”。对吗?

不,你错了。它正在打印"In Method",因为您定义了这样做的方法。

yield 是执行代码块的唯一方法吗?

不,您可以使用 & 将块作为 proc 接受,并在其上调用 call

def foo &block
  block.call(arguments)
end

【讨论】:

  • 是的。我正是这个意思。由于我没有传递任何参数,它正在执行默认值 - 根据方法定义
  • “默认”一词表示在某些情况下被覆盖(取消)的东西。方法定义中的puts ... 行绝不会被任何东西覆盖;它总是被执行。
  • 好的。我的另一个问题是“yield 是执行代码块的唯一方法吗?”
  • @Zack 不,您可以使用 def my_method(&block) 语法“捕获”变量中的块(它将被转换为 proc 对象),并以与调用其他所有 proc 相同的方式调用您的块: block.call.
  • 好的。这对我来说是新事物!谢谢@MarekLipka
猜你喜欢
  • 2012-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多