ぞえの技術めも

Ruby on Rails勉強中

【22日目】【1日20分のRailsチュートリアル】メソッドの定義と配列と範囲演算子

Ruby on Railsチュートリアル(第3版)

今日は「4.2.4 メソッドの定義」から。

4.2.4 メソッドの定義

コンソールでstring_messageというメソッドを定義。

>> def string_message(str = '')
>>    if str.empty?
>>      "It's an empty string!"
>>    else
?>      "The string is nonempty."
>>    end
>>  end
=> :string_message
>> puts string_message("foobar")
The string is nonempty.
=> nil
>> puts string_message("")
It's an empty string!
=> nil
>> puts string_message
It's an empty string!
=> nil

定義したメソッドをよくよく見ると、特に返り値定義しないのに渡された文字列に応じた返り値が出力されている。

ここで、Rubyの関数には「暗黙の戻り値がある」ことにご注意ください。これは、関数内で最後に評価された式の値が自動的に返されることを意味します (訳注: 関数で戻り値を明示的に指定しなかった場合の動作です)。

ということらしい。

下記のようにreturn文使って戻り値を明示的に指定することも可能。

>> def string_message(str = '')
>>   return "It's an empty string!" if str.empty?
>>   return "The string is nonempty."
>> end

メソッドで引数の変数名にどんな名前を使っても、メソッドの呼び出し側には何の影響も生じないという点にもご注目ください。

他言語でもそうなのでここはスルー。

4.2.5 title ヘルパー、再び

ここまで学習した内容を元にtitleヘルパーの内容を読み解く。
戻り値について理解できたのが大きいかなぁ。

app/helpers/application_helper.rb

module ApplicationHelper

  # ページ毎に完全なタイトルを返す         # ドキュメントとしてのコメント
  def full_title(page_title = '')                     # メソッド定義とオプション引数
    base_title = "Ruby on Rails Tutorial Sample App"  # 変数の代入
    if page_title.empty?                              # 論理値でテスト
      base_title                                      # 暗黙的な返り値
    else
      page_title + " | " + base_title                 # 文字列の結合
    end
  end
end

4.3 他のデータ構造

文字列に結構時間かかってるので他はさくっといこうかな。

4.3.1 配列と範囲演算子

splitメソッドの説明。文字列を配列に変換可能。
区切り文字はデフォルトでは空白だけど他の文字を指定することも可能。

>> "foo bar     baz".split  
=> ["foo", "bar", "baz"]

配列のアクセスについて。
添字がマイナスになってもエラーにならないのが不思議。。。

>> a = [42, 8, 17]
=> [42, 8, 17]
>> a[-1]              # 配列の添字はマイナスにもなれる!
=> 17

firstsecondlastでもアクセス可能。
配列だけどリストに近いのかな…?

配列の内容を変更したい場合は、そのメソッドに対応する「破壊的」メソッドを使用します。破壊的メソッドの名前には、元のメソッドの末尾に「!」を追加したものを使用するのがRubyの慣習です。

破壊的メソッド。。。

>> a
=> [42, 8, 17]
>> a.sort!
=> [8, 17, 42]
>> a
=> [8, 17, 42]

!をうっかり忘れてハマったりしそうだなー。

あと範囲っていう概念?があるらしい。
便利そう。
慣れるまでは難しそう。

>> 0..9.to_a              # 配列でない数字の9にto_aを実行してしまった
NoMethodError: undefined method `to_a' for 9:Fixnum
>> (0..9).to_a            # 丸かっこを使って明示的に範囲クラスのto_aメソッドを呼
=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

今日はここまで。

Rubyでのメソッド定義と配列と範囲演算子について学習しました。
今日の作業時間は【24分】

次は「4.3.2 ブロック」から。