2012-02-12 6 views
1

私はMichael HartlのRuby on Rails 3.2チュートリアルを見ていますが、4.1.1節で見つかったタイトルヘルパーが失敗しない理由について混乱しています。RoRチュートリアルChapter 4.1.1、なぜタイトルヘルパーが失敗しないのか混乱している

彼はあなたがビューからのコードのこのビットを除外イベントでタイトルヘルパーを必要と語る:

<% provide(:title, 'Home') %> 

しかし、アプリケーションのレイアウトファイルに次の行があります:

<title><%= full_title(yield(:title)) %></title> 

提供は、:titleシンボルに値を設定していないので、それはfull_titleヘルパーにnilの値を渡しませんか?

def string_message(string) 
    if string.empty? 
    "It's an empty string!" 
else 
    "The string is nonempty." 
end 
end 

これはさらに私を混同:

後の章で、彼はfull_title関数と同じであるレールコンソールに入力された例があります。コンソールで

は、私が入力した場合:

  • string_message("")

    が、私は"It's an empty string!"
  • string_message("something")を取得し、その後、私はArgumentError: wrong number of arguments (0 for 2..3)
  • を取得し、その後、私はNoMethodError: undefined method 'empty?' for nil:NilClass
  • string_message(test)を取得し、その後、私は"The string is nonempty."
  • string_message(nil)を取得しますstring_message(:test)それから私はを得る

したがって、定義されていないシンボルを渡してもnil値は返されません。しかしそれも空ではないのですか?なぜそうではありません:タイトルは空ではないとして扱われますか?誰かが私にこのことを明確にすることができれば、それは素晴らしいことだ。

+0

"未定義のシンボル" とは? –

答えて

1

あなたの引数は "string"ですが、これは文字列でなければならないという考えに惑わされないでください。誰かが関数に引数を渡すことができ、関数に問題があるかどうかは、そのオブジェクトが "空"に応答するかどうかによって異なります。メッセージ。

あなたは

"".empty? 

string_message("") 

コールを呼び出す場合はtrueに評価されます。

nilオブジェクトを渡すと、nilは空をサポートしていませんか?シンボルですpigs_on_the_wing、:メッセージ、あなたはに空のメッセージを送信している任意のシンボル

string_message(:pigs_on_the_wing) 

を投げるとき、それは誤り

がスローされますので。シンボルは「空?」を定義します。シンボルの本文が ""の場合にのみtrueを返すようにします。

例えば、IRBに:

:"".empty?    # true 
:pigs_on_the_wing.empty? #false 

あなたは、常にソースに直接行くことができますが:

http://www.ruby-doc.org/core-1.9.3/Symbol.html#method-i-empty-3F

+0

迅速な対応に感謝します。 –

関連する問題