プロを目指す人のためのRuby入門を読んだ
戻り値について
・if
文、unless
、case
は最後に評価された式を戻り値として返す。
・メソッドも最後に実行した式がそのまま戻り値になる。
だから、変数 = メソッド、if文、unless、case
で変数に代入出来る。
演算子(三項演算子)
条件式 ? 真だった場合の処理 : 偽だった場合の処理
If文と同じ様に条件分岐した結果を変数に代入する事も出来る
変数のスコープについて
・ブロック内でで初めて出てきた変数のスコープは、そのブロック内のみ。
・ブロックの外で作成されたローカル変数はブロック内部でも参照できる。
これは分かっていた事だが、ブロックの外に変数を定義するのを忘れ、エラーを出して気づくという事をいつもしているのでよく気をつける様にしたい。
&:を使った書き方
['ruby', 'java', 'python'].map(&:upcase)
ブロックパラメータ(ブロック内で|s|
となっている部分のこと)が1つだけ、かつブロック内のメソッドに引数がない、かつブロック内にメソッドを1回呼び出す以外の処理がない場合はこの書き方が出来る。
○以上○以下(未満)の判定
<や>=などの不等号より範囲オブジェクトが使える。
# 0度以上100度未満であれば液体と判断する
def liquid?(temperature)
(0...100).include?(temperature)
end
sum
の使い方
自分では絶対に思いつきそうにない書き方。よく覚えておきたい!
def to_hex(r, g, b)
[r, g, b].sum('#') do |n|
n.to_s(16).rjust(2, '0')
end
end
sum
は[r, g, b]
にブロック内の処理を実行し、実行結果の要素の合計を返す。
そしてメソッドは最後の処理を戻り値とする。
%
の使い方
%記法としての使い方
空白文字が要素の区切り文字となり、`や”で囲う必要がない、などから、コードを短く書ける場合がある。
リテラル (Ruby 3.1 リファレンスマニュアル)
文字列を整形するための%
出力する時の文字列の形式を整えることが出来る。
String#% (Ruby 3.1 リファレンスマニュアル)
with_indexメソッド
さまざまな繰り返し処理用のメソッドと組み合わせて使える。
Fruits = [‘apple’, ‘orange’, ‘melon’]
Fruits.map.with_index{ |fruits, I| “#{I}:#{fruits}” }
# => [“0:apple”, “1:orange”, “2:melon”]
Enumerator#with_index (Ruby 3.1 リファレンスマニュアル)
これは今後すごく使えそう!
Hash
( )の省略
・メソッドの第一引数にハッシュを渡すときは必ず( )
を付ける。
ハッシュを扱う時に謎のエラーが出たものの中にこれがかなり入っていた気がする。
知れて良かった。
メソッド定義時の引数の順番
書く順番があるので引数いくつか定義する時は気をつける。
条件分岐で変数に代入するときの&.
a = foo
a&.upcase #=>”FOO”
Aがnilであればnilを返し、nil以外の場合はその後のメソッドを実行した結果を返す
nilガード
limit = nil
limit ||= 10 #=>10
Limitがnilの時は10が代入される
!!を使った真偽値変換
Rubyでは「nilまたはfalseであれば偽、それ以外は全て真」だから、
!!を2回することにより、それ以外のものをtrueに変換出来る。
nilもfalseに変換される。
文字列の置き換え
置き換えたい部分を正規表現で記述し、置き換え後の文を作り、gsubメソッドを使うとそれだけで全て置き換えられる。1つ1つ見つけ、置き換える必要はない。
old_syntax = <<~TEXT
{
:name => 'Alice',
:age=>20,
:gander => :female
}
TEXT
old_syntax.gsub(/:(\w+) *=> */) do
"#{$1}: "
end
ヒアドキュメントのエラーについて
正規表現の例題でこのようなエラーを出してしまい、この謎の/t
はなんだ!となった。
原因はタイポによりインデントの数が統一されていなかったせいと思われる。
インデントの数をきちんと揃えたらエラーは無くなった。
https://docs.ruby-lang.org/ja/latest/doc/spec=2fliteral.html#here
リファレンスのヒアドキュメント (行指向文字列リテラル)の<<~
の説明より
最もインデントが少ない行を基準にして、全ての行の先頭から空白を取り除きます。インデントの深さを決定するために主にタブやスペースで構成された行は無視されるので、注意してください。しかし、エスケープされたタブやスペースは、通常の文字と同じように扱われます。
モジュールの用途
・モジュールを利用したメソッド(includeとextend)
・モジュール関数(ミックスインとしてもモジュールの特異メソッドとしても使える)や定数を提供する
・モジュールを利用した名前空間
・状態を保持するモジュール
(外部ライブラリなどで設定値を保持させる)
1つのモジュールが複数の用途で使われる場合もある。
クラスとモジュールの違い
・モジュールからインスタンスを作成することはできない
・他のモジュールやクラスを継承することが出来ない
この違いを理解し、インスタンスを作って何か操作する必要がないのであれば、モジュールにしておくのが良い。