目次
- Rubyのメソッド
- 参照の概念
- ライブラリ
Rubyのメソッド
Rubyには標準でいろんなメソッドがあります。
また、自分でメソッドを定義することも可能です。
メソッドに引数を設定する
defcry(animal)ifanimal=='dog'puts'woof woof!'elsifanimal=='cat'puts'meow meow!'endendcry('dog')# -> woof woof!cry('cat')# -> meow meow!# 引数に過不足があるとエラーになる# cry -> `cry': wrong number of arguments (given 0, expected 1) (ArgumentError)
メソッドを定義する際引数を設定できます。
今回はcryというメソッド名で引数によって動物の鳴き声を出力するメソッドを定義しました。
引数にはデフォルト値をつけることも可能
defcry(animal: 'cat')ifanimal=='dog'puts'woof woof!'elsifanimal=='cat'puts'meow meow!'endendcry(animal: 'dog')# -> woof woof!# 引数がない場合でもエラーにならない!cry# -> meow meow!
通常引数は呼び出し側(実引数)とメソッド定義側(仮引数)で数が一致している必要があります。
ですが、メソッド定義側でデフォルト値を設定することが可能です。
今回はcryというメソッド名で引数によって動物の鳴き声を出力するメソッドに
引数が存在しない場合はデフォルト値をcatとして定義しました。
標準出力で使われるメソッド
puts 'Hello World'
Hello World
=> nil
print 'Hello World'
Hello World=> nil
p 'Hello World'
"Hello World"
=> "Hello World"
メソッドを定義してターミナルに出力確認をする際今回の記事ではputsメソッドを使用していますが他にもターミナルに出力できるメソッドがあります。
irbを使用して確認して見た結果
puts
引数のオブジェクトをto_sメソッドで文字列に変換し、改行を加えて出力する。
戻り値: nil
print
引数のオブジェクトをto_sメソッドで文字列に変換し、改行ををせず出力する。
戻り値: nil
p
引数のオブジェクトをinspectメソッドで文字列に変換し、改行ををせず出力する。
戻り値: 文字列
真偽値を返すメソッド
# ?で終わるメソッドを自作する場合defwhat_name?(name)name=='bob'endpwhat_name?('tom')# -> falsepwhat_name?('bob')# -> true
真偽値を返すメソッドとしてメソッド名の終わりに?をつけたメソッドがあります。
※"".empty?
や"Hello World".include?(Hello)
など
自作する場合でもメソッド名に?をつけたほうが戻り値がわかりやすくなります。
エイリアスメソッド
# メソッドを定義するdefhelloputs'Hello World!'end# aliasを設定するaliasgreetinghello# 元のメソッド名でも呼び出せ、aliasで設定した別名でも同様に呼び出すことができるhello# -> Hello World!greeting# -> Hello World!
Rubyにはメソッドに複数の名前をついている場合、自分で任意の名前
で定義することができます。
今回はhelloメソッドの名前をgreetingと別名で定義しました。
Rubyの戻り値
defexpressionhello='Hello World'end# retern分を記載しなくても最後に評価された式が戻り値として取得できるpexpression# -> Hello World
functionexpression(){lethello="Hello World"// return hello}// return文を記載しなければ戻り値を取得できないconsole.log(expression())// -> undefinedfunctionexpression(){lethello="Hello World"returnhello}// return文を記載すれば戻り値を取得できるconsole.log(expression())// -> Hello World
Rubyのメソッドではreturn
を記載しない場合、
最後に評価されたものが戻り値になります。
これは他の言語と少し違います。
試しにrubyでreturn
を記載しないで定義したメソッドと
javascriptでreturn
を記載しないで定義したメソッドを比較してみます。
擬似変数
ptrue# -> truepself# -> mainp__FILE__# -> ファイル名p__LINE__# -> 行番号p__ENCODING__# -> エンコーディング# 擬似変数に代入しようとすることはできない# p __ENCODING__ = 'test' # -> Can't assign to __ENCODING__
Rubyには擬似変数と呼ばれる特殊な変数が存在します。
擬似変数は値を変更することはできません。
破壊的メソッド
lang='ruby'# upcaseだと呼び出した文字列自身は変化しないplang.upcase# -> RUBYplang#-> ruby#upcase!だと呼び出した文字列自身が変化するplang.upcase!# -> RUBYplang# -> RUBY
Rubyのメソッドにはオブジェクトの値そのものを変更してしまうメソッドが存在します。
今回は upcase
,upcase!
を使用して'ruby'という文字列を'RUBY'に変換します。
以下の出力結果を確認するとupcase
の場合、変数aの値は変化していません。
しかし、upcase!
の場合変数aの値が変わっています。
このように破壊的メソッドを使用すると呼び出したオブジェクトの状態を変更することができます。
参照の概念
Rubyのメソッドが色々あるなか破壊的メソッドを用いた場合、値が書き換わりました。
実際にはRubyの変数に代入すると変数に値が格納されるわけではありません。
変数にはオブジェクトの参照情報が格納されます。
メモリ領域
パソコンがしてくれる作業を僕ら人間に当てはめるとこんな感じになります。
1. 考える脳みそ -> CPU
2. 作業する机 -> メモリ
変数に値を格納した時パソコンのメモリ領域(作業する机の領域)がどうなるかというとこんなイメージになります。
lang='ruby'# upcaseだと呼び出した文字列自身は変化しないplang.upcase# -> RUBY# upcaseした際のオブジェクト番号を確認plang.upcase.object_id# -> 70178687801560plang#-> ruby# 変数のオブジェクト番号を確認plang.object_id# -> 70178687801780# upcase!した際のオブジェクト番号を確認plang.upcase!.object_id# -> 70178687801780plang# -> RUBY# 変数のオブジェクト番号を確認plang.object_id# -> 70178687801780
ここで先ほどの破壊的メソッドについて戻ろうと思います。
upcase
とupcase!
でのオブジェクト番号を確認するとupcase
ではオブジェクト番号が違うため、新しくオブジェクトを生成し、そのオブジェクトの参照情報を格納しております。
upcase!
ではオブジェクト番号が同一であることがわかります。
このことから変数にはオブジェクトへの参照が格納されており破壊的メソッドを使用することで、指定のオブジェクトの中身を書き換えているということがわかりました。
ガベージコレクション(GC)
パソコンがいろんな処理を行う際、作業机(メモリ領域)の場所を確保していきます。
作業机(メモリ領域)が場所が減っていくとそのうちスペースがいっぱいになってしまいます。
スペースがいっぱいになると僕ら人間が効率よく作業できないのと同様にパソコンも作業スペース
(メモリ領域)が減っていくと何もできなくなり処理が重たくなったり、最悪システムが停止したりします。
このようにメモリ領域が減っていく現象をメモリリークと言います。
このような状態にならないようにRubyにはガベージコレクションという機能が備わっています。
ガベージコレクションのおかげで僕らが作業スペースの後片付け(メモリの解放)をしなくても
使用されなくなったオブジェクトを片付けてくれます。
※家事代行サービスにお願いすればプロがよしなにやってくれる感じみたいですね。
ライブラリ
Rubyでは最初から便利なプログラムがたくさん用意されています。
その便利なプログラムを寄せ集めたものをライブラリと言います。
組み込みライブラリ
text='Hello World'ptext.class# -> Stringptext.methods.include?(:length)# -> trueptext.length# -> 11
人間でいうと本人の習得しているスキルのイメージです。
英語をネイティブレベルまで習得しているなら海外旅行に行って話す際、教科書を見なくても話せると思います。
※僕は英語話せませんが、、、
組み込みライブラリは Ruby 本体に組み込まれているため、わざわざ処理を実装しなくても
同様の処理をするプログラムが組み込みライブラリに存在していればそれを使用すれば良いのです。
今回は文字列の長さを取得する処理を実装するために、String
クラスのlength
メソッドを使用しました。
標準ライブラリ
スキルはまだ身についてないけど家にある本棚から書籍を使えばアプリ開発ができるのと同じように
標準ライブラリではあるものの、組み込みライブラリでないものについてはライブラリを読み込むことで使用することができます。
今回はTimeクラスに定義されているstrptimeメソッドを使用します。
require'Time'pTime.strptime('2020-03-21T01:58:30+09:00','%Y-%m-%dT%H:%M:%S%z')# -> 2020-03-21 01:58:30 +0900
gem
スキルが身についていない、家の本棚にもない場合でも問題ありません。
Rubyでは偉大な先輩エンジニアの方々が外部ライブラリとして、RubyGemsにアップロードしてくれています。
僕らは使いたいgemをそこからダンロードして、自分の端末にインストールすることで使用することができます。
今回はrails 5.2.3というgemをインストールして見ました。gem i -v 5.2.3 rails
参考
プロを目指す人のためのRuby入門 言語仕様からテスト駆動開発・デバッグ技法まで