2015-01-17 119 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中的關閉。