【问题标题】:Ruby Koans: blocks and arguments (test_blocks_can_take_arguments)Ruby Koans:块和参数 (test_blocks_can_take_arguments)
【发布时间】:2015-03-15 19:43:28
【问题描述】:

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,但我很难理解发生了什么。具体来说:

  • argumentassert_equal... 是块吗?
  • 在没有yield 的情况下method_with_block_arguments 返回“Jim”的情况下yield 在做什么?

【问题讨论】:

  • @matt Dude,你写了一本旨在教授编程的书,这就是你的答案?到目前为止,我已经完成了所有的 koans,并且我有点理解块和产量,但是在这个练习中我很难把它们放在一起。如果你不能同情初学者试图融入新概念,请不要试图当老师。
  • @matt 朋友,我不是要求学习整个语言。我问的是如何在这个练习中应用特定的新概念。老实说,我不明白你的态度,尤其是因为我怀疑其他人觉得这个练习很有挑战性。无论如何,如果问题措辞不当并试图澄清它们,我很抱歉。

标签: ruby block yield


【解决方案1】:

我认为上面的一些评论者说你目前对 Ruby 的理解不是很深,但不要因此而气馁。只是需要时间来学习。当我第一次学习 Ruby 时,块的概念和它们的语法确实花了我一些时间来理解。一旦你得到它,语法就很简单了,但是直到你达到那个点......

任何人,这是我试图帮助你的尝试。 :)

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

yield 所做的是了解块如何工作的关键。 yield 的作用是将控制权“交给”调用函数。您可能会将其视为回调。当你在函数中间说“yield”时,你实际上是在说“在这个函数的中间,我想让其他人插入他们的代码并决定应该发生什么。” em> 如果您使用不带参数的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 最强大的部分之一。

【讨论】:

  • 这回答了我的问题并帮助我了解产量,谢谢!我绝对是 Ruby 新手。 :)(我会投票,但我还没有足够的代表。)
【解决方案2】:
  1. argument 或 assert_equal... 是块吗?

不,argument 和 assert_equal 都不是块,argument 是变量,doend 之间的任何东西都是块。 assert_equal 是一个普通的方法调用。

  1. 鉴于 method_with_block_arguments 返回“Jim”而没有 yield,yield 做了什么?

产量使它与众不同。它调用块(即doend 之间的所有内容)并执行它。 “Jim”是块的参数。

这是我在学习 ruby​​ 时从 Paul 那里复制的要点。这应该有助于了解 ruby​​ 中的闭包。

【讨论】:

    猜你喜欢
    • 2012-12-12
    • 2015-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-13
    • 1970-01-01
    • 2012-10-29
    相关资源
    最近更新 更多