Ruby Koans:块和参数(test_blocks_can_take_arguments)

时间:2015-01-17 06:34:56

标签: ruby block yield

Ruby Koans在about_blocks.rb中进行了以下练习:

  def method_with_block_arguments
    yield("Jim")
  end

  def test_blocks_can_take_arguments
    method_with_block_arguments do |argument|
      assert_equal __, argument
    end
  end

我知道答案是 assert_equal" Jim",论证,但我很难理解发生了什么。具体做法是:

  • argument还是assert_equal...块?
  • 假设method_with_block_arguments返回" Jim" yield做什么没有yield

2 个答案:

答案 0 :(得分:4)

我认为上述一些评论者说你目前对Ruby没有非常深刻的理解是正确的,但不要让这些让人气馁。这需要时间来学习。当我第一次学习Ruby时,块的概念及其语法确实需要一些时间来解决。一旦你得到它,语法很简单,但直到你达到那一点......

Anywho,这是我试图帮助你的。 :)

argument块变量doend之间的所有内容都是块。 assert_equal只是一个常规方法调用,与块无关。

yield做什么是理解块如何工作的关键。 yield它对调用函数“产生”控制的作用是什么。您可能会将其视为回调。当你在一个函数的中间说“yield”时,你基本上是说“在这个函数的中间,我想让其他人插入他们的代码并做出应该发生什么的决定。”如果您使用没有参数的yield,则方法中的数据不会传递回调用者。

本质上,yield是一种向其他人“屈服”控制的方式,在这种情况下是你的函数的调用者。

当您使用一个或多个参数调用yield时,您将数据从您的函数传递回调用者。因此,当您说yield("Jim")时,您将字符串"Jim"交给任何调用method_with_block_arguments的人。

最后,您必须了解在Ruby中,方法始终返回特定方法中最后一个表达式的结果。这就是为什么您通常不需要明确的return语句。

例如,此方法将返回42

def foo
  42
end

那是因为42是Ruby中的有效表达式。它只是一个身份,但它是有效的Ruby,所以Ruby只是说“好吧,你说42,这是这个方法声明中的最后一件事。所以当人们称'foo'时他们会回来42”。

我希望这会有所帮助。我认为在这一点上你应该假设你在Ruby学习方面还处于早期阶段,但是你正在调查块。一旦你得到它们,你就会理解Ruby最强大的部分之一。

答案 1 :(得分:2)

  
      
  1. 是参数还是断言_equal ...块?
  2.   

不,参数和assert_equal都不是块,argument是变量,doend之间的任何内容都是块。 assert_equal是正常的方法调用。

  
      
  1. 如果method_with_block_arguments返回" Jim"没有收益?
  2.   

产量是让它变得特别的原因。它调用块(即doend之间的所有内容)并执行它。 "吉姆"是块的参数。

这是我在学习红宝石时从保罗那里复制的要点。这应该有助于了解红宝石中的闭包。