2015-01-17 77 views
0

Ruby Koans在about_blocks.rb下面的练习:红宝石Koans:块和参数(test_blocks_can_take_arguments)

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 “吉姆” 的说法,但我努力理解发生什么事。具体如下:

  • argumentassert_equal...该块?
  • 什么是yield在给出method_with_block_arguments返回“Jim”而没有yield
+0

仔细阅读[_ The Well-Grounded Rubyist,Second Edition_](http://www.manning.com/black3/).. –

+1

@matt Dude,你写了一本旨在教授编程的书,那是你的答案?到目前为止,我已经完成了所有的koans,并且我理解了块和屈服,但是我在这个练习中遇到了麻烦。如果你不能同情尝试整合新概念的初学者,请不要试图当老师。 – Mark

+0

@matt朋友,我不是要求被教整个语言。我在问这个练习中如何应用特定的新概念。我真的不明白你的态度,特别是因为我怀疑其他人认为这种做法具有挑战性。无论如何,如果问题措辞不佳,并试图澄清问题,我很抱歉。 – Mark

回答

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

这回答了我的问题,并帮助我了解产量,谢谢!我绝对是Ruby新手。 :)(我会投票,但我没有足够的代表。) – Mark

2
  1. Is argument or assert_equal ... the block?

否,参数都不也不assert_equal是一个块,argumentdoend之间的变量和任何是块。 assert_equal是一个正常的方法调用。

  • 什么正在做给定的产率即method_with_block_arguments返回 “吉姆” 而不屈服?
  • 产量是什么使它特殊。它调用该块(即doend之间的所有内容)并执行它。 “吉姆”是该块的参数。

    这是我在学习ruby时从Paul复制的一个要点。这应该有助于了解关于Ruby中的关闭。