らくだ🐫にもできるRailsチュートリアル|4.2

4.2 文字列とメソッド

irbの設定

ターミナル
$ nano ~/.irbrc

エディタが開くので本文のコードをコピペ

Ctrl-X → Y → Enter

コンソールを起動する

ターミナル
(rails-flavored-ruby) $ rails console
Running via Spring preloader in process 4544
Loading development environment (Rails 5.1.6.2)
>> 

rails cに省略可能

4.2.1 コメント

本文ママ

4.2.2 文字列

文字列は「””」で囲む

ターミナル(コンソール)
>> 17 + 42
=> 59
#整数の足し算
>> "17" + "42"
=> "1742"
#""で囲んだことにより「17」と言う文字列と「42」と言う文字列を足している事になる
>> 

展開式

変数を#{}で囲んで代入した値を展開する

ターミナル(コンソール)
>> first_name = "Michael"    # first_name に Michaelを代入
=> "Michael"
>> "#{first_name} Hartl"     # first_nameに代入された Michael を展開
=> "Michael Hartl"

出力

ターミナル(コンソール)
>> puts "foo"
foo  #puts出力は自動的に改行される
=> nil
>> print "foo" 
foo=> nil  #print出力は自動的に改行されない
>> print "foo\n"  #改行させたい場合は改行文字を挿入「バックスラッシュ (\) + n」
foo
=> nil

環境によってはバックスラッシュが¥に見えてるかもしれませんが/(スラッシュ)の逆向きのやつです

putsメソッドとnil

putsメソッドの戻り値は実はnil
上記の例で言えば、文字列”foo”はputsの戻り値ではなく副作用として表示されている

ターミナル(コンソール)
>> puts

=> nil
#戻り値のnilだけが表示される

シングルクォート内の文字列

ターミナル(コンソール)
#シングルクォートで囲っても文字列として認識される
>> 'foo' 
=> "foo"
>> 'foo' + 'bar'
=> "foobar"

#ただしシングルクォート内では式展開が行われない
>> foo = "rakuda"
=> "rakuda"
>> "#{foo}"
=> "rakuda"
>> '#{foo} bar'
=> "\#{foo} bar"

#ダブルクォート内で#{などの特殊文字を使いたい場合はバックスラッシュでエスケープする必要がある
>> "\#{foo}"
=> "\#{foo}"
#エスケープしているのでダブルクォート内でも式展開されない

演習

  1. city変数に適当な市区町村を、prefecture変数に適当な都道府県を代入してください。
  2. 先ほど作った変数と式展開を使って、「東京都 新宿区」のような住所の文字列を作ってみましょう。出力にはputsを使ってください。
  3. 上記の文字列の間にある半角スペースをタブに置き換えてみてください。(ヒント: 改行文字と同じで、タブも特殊文字です)
  4. タブに置き換えた文字列を、ダブルクォートからシングルクォートに置き換えてみるとどうなるでしょうか?

※タブを表す特殊記号「\t」

ターミナル(コンソール)
#1.都市名を代入
>> city = "甲府"
=> "甲府"
>> prefecture = "山梨"
=> "山梨"

#2.半角で区切って出力
>> puts "#{prefecture}県 #{city}市"
山梨県 甲府市
=> nil

#3.タブ文字(\t)に置き換えて出力
>> puts "#{prefecture}県\t#{city}市"
山梨県  甲府市  #半角スペース×2で出力されている(ソフトタブ・2の設定があるから?)
=> nil

#4.シングルクォートに置き換え
>> puts '#{prefecture}県\t#{city}市'
#{prefecture}県\t#{city}市  #式展開がされず、特殊文字はそのままで出力
=> nil

4.2.3 オブジェクトとメッセージ受け渡し

Rubyではあらゆるものがオブジェクトである
オブジェクトとは → 考えるな感じろ(4.4.2で説明があるとの事)
オブジェクトが何をするか → メッセージに応答する

ターミナル(コンソール)
>>  "foobar".length 
#オブジェクト(文字列)←length(文字列の文字数を返してもらうためのメッセージ)
=> 6

オブジェクトに渡されるメッセージ → メソッド → そのオブジェクト内で定義されたメソッド
上記で言うとlengthがメソッド

ターミナル(コンソール)
>> "foobar".empty?
#オブジェクトは空っぽですか?
=> false
#文字列が入っているのでfalse
>> "".empty?
=> true
#空っぽなのでtrue

論理値(trueかfalse)を返すときは末尾に?を付ける習慣がある

ターミナル(コンソール)
>> s = "foobar"  #sに文字列foobarを代入
>> if s.empty?
   #もしsが空っぽなら
>>   "The string is empty"
     # "The string is empty"を返す
>> else
  #そうでないなら
>>   "The string is nonempty"
    #"The string is nonempty"を返す
>> end
=> "The string is nonempty"
  #空っぽではない(false)ので"The string is nonempty"

#条件が2つ以上ある時はelsif(else+if)文を使う
>> if s.nil?
>>   "The variable is nil"
>> elsif s.empty?
>>   "The string is empty"
>> elsif s.include?("foo")
>>   "The string includes 'foo'"
>> end
=> "The string includes 'foo'"

演算子を使うことも出来る

ターミナル(コンソール)
>> x = "foo"
#xに文字列fooを代入
=> "foo"
>> y = ""
#yに空っぽを代入
=> ""
>> puts "Both strings are empty" if x.empty? && y.empty?
# もしxが空っぽ かつ yが空っぽなら"Both strings are empty"を出力
=> nil  #falseなので出力されない
>> puts "One of the strings is empty" if x.empty? || y.empty?
#もしxが空っぽ もしくは yが空っぽなら"One of the strings is empty"を出力
"One of the strings is empty"  #trueなので出力される
=> nil
>> puts "x is not empty" if !x.empty?
#もし xがからっぽ ではない なら"x is not empty"を出力
"x is not empty"  #trueなので出力される
=> nil

nil(空っぽ)もオブジェクト → 多くのメソッドに応答できる

ターミナル(コンソール)
>> nil.to_s  #nil ← to_s(ほぼあらゆるオブジェクトを文字列に変換するメソッド)
=> ""  #空っぽの文字列

>> nil.empty? #nilは空っぽか確認
NoMethodError: undefined method `empty?' for nil:NilClass
#nilに対してempty?は未定義のメソッドです(なので使えません)的なエラー
>> nil.to_s.empty?
#nilを 文字列にして 空っぽか確認
=> true
#nil.to_sでnilが""になっている ""が空っぽか確認 → true
#このようにメソッドを繋げることをメソッドチェーンと言う

nilかどうかを調べる

ターミナル(コンソール)
>> "foo".nil?
=> false
>> "".nil?
=> false
>> nil.nil?
=> true
#「nil」の時だけtrueが返ってくる
ターミナル(コンソール)
#後続if
#後続の条件式がtrueの時だけ実行される(falseの時は実行されない)
>> puts "x is not empty" if !x.empty?
x is not empty
=> nil

#unless式 if式とは逆でfalseの時に実行される
>> string = "foobar"
=> "foobar"
>> puts "The string '#{string}' is nonempty." unless string.empty?
The string 'foobar' is nonempty.
=> nil

オブジェクトそのものの論理値がfalseになるのはfalse自身とnilだけ
!(否定)を付けると論理値が反転
!!(バンバン)は2回否定なので強制的に論理値に変換できる

ターミナル(コンソール)
>> nil
=> nil  #nilはnil
>> !nil
=> true  #!(not)を付けたnilの論理値は反転してtrue
>> !!nil  
=> false  #2回否定により一周回ってfalse

>> false
=> false
>> !false
=> true
>> !!false
=> false

#!!(2回否定)する事で論理値が返ってくる
>> 0
=> 0  #0は0
>> !!0
=> true  #0の論理値はtrue

演習

  1. “racecar” の文字列の長さはいくつですか? lengthメソッドを使って調べてみてください。
  2. reverseメソッドを使って、”racecar”の文字列を逆から読むとどうなるか調べてみてください。
  3. 変数sに “racecar” を代入してください。その後、比較演算子 (==) を使って変数sとs.reverseの値が同じであるかどうか、調べてみてください。
  4. リスト 4.9を実行すると、どんな結果になるでしょうか? 変数sに “onomatopoeia” という文字列を代入するとどうなるでしょうか? ヒント: 上矢印 (またはCtrl-Pコマンド) を使って以前に使ったコマンドを再利用すると一からコマンドを全部打ち込む必要がなくて便利ですよ。)
ターミナル(コンソール)
>> 
#1.7文字
"racecar".length
=> 7

#2.逆から読んでもレースカー!
>> "racecar".reverse
=> "racecar"

#3.代入して比較 → true
>> s = "racecar" 
=> "racecar"
>> s == "racecar" 
=> true

#sとsを逆にしたものが等しければIt's a palindrome!(回文です!)と出力
>> puts "It's a palindrome!" if s == s.reverse
It's a palindrome!
=> nil
>> s = "onomatopoeia"
=> "onomatopoeia"
>> puts "It's a palindrome!" if s == s.reverse
=> nil

4.2.4 メソッドの定義

Railsコンソールでもメソッドを定義することが出来る

ターミナル(コンソール)
>> def string_message(str = '')
#関数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.
>> puts string_message("")
It's an empty string!
>> puts string_message  #引数付けていないため初期値('')が呼び出される
It's an empty string!  #初期値は''(空っぽ)なのでこの結果に

「暗黙の戻り値がある」と、言う事

ターミナル(コンソール)
>> def string_message(str = '')
>> return "It's an empty string!" if str.empty?
#It's an empty string!を返す strが空っぽだったら(後続if)
>> "The string is nonempty."
#そうでなければThe string is nonempty.を返す
#returnが無くても暗黙で値を返す
>> end
=> :string_message
>> puts string_message("foobar")
The string is nonempty.
=> nil

演習

  1. リスト 4.10のFILL_INの部分を適切なコードに置き換え、回文かどうかをチェックするメソッドを定義してみてください。ヒント: リスト 4.9の比較方法を参考にしてください。
  2. 上で定義したメソッドを使って “racecar” と “onomatopoeia” が回文かどうかを確かめてみてください。1つ目は回文である、2つ目は回文でない、という結果になれば成功です。
  3. palindrome_tester(“racecar”)に対してnil?メソッドを呼び出し、戻り値がnilであるかどうかを確認してみてください (つまりnil?を呼び出した結果がtrueであることを確認してください)。このメソッドチェーンは、nil?メソッドがリスト 4.10の戻り値を受け取り、その結果を返しているという意味になります。
ターミナル(コンソール)
>> def palindrome_tester(s)
>>     if s == s.reverse
       #1.sとsを逆にしたものが等しければ(回文であれば)
>>       puts "It's a palindrome!"
>>     else
>>       puts "It's not a palindrome."
>>    end
>> end
=> :palindrome_tester

#2.それぞれの結果
>> puts palindrome_tester("racecar")
It's a palindrome!
=> nil
>> puts palindrome_tester("onomatopoeia")
It's not a palindrome.
=> nil

#3.nil?メソッド呼び出したメソッドチェーン
>> puts palindrome_tester("racecar").nil?
It's a palindrome!
true  #putsの戻り値はnilなのでtrue(上の文字列は戻り値ではなく副作用)
=> nil

4.2.5 titleヘルパー、再び

titleヘルパーの解説は本文ママ

module ApplicationHelper

module → 関連したメソッドを纏める方法の一つ
includeメソッドを使って読み込むことが出来る

railsではinclude行を書かなくても自動的にヘルパーmoduleを読み込んでくれる
 →自動的にすべてのビューで利用できる

まとめとか感想

良くわかっていない用語が多かったので
調べて(ある程度)納得するのに中々時間がかかってしまいました🐫💦
苦手意識が強い部分なのでじっくり向き合いたい。

らくだ🐫にもできるRailsチュートリアルとは

「ド」が付く素人のらくだ🐫が勉強するRailsチュートリアルの学習記録です。
自分用に記録していますが、お役に立つことがあれば幸いです。

調べたとはいえらくだ🐫なりの解釈や説明が含まれます。間違っている部分もあるかと思います。そんな所は教えて頂けすと幸いなのですが、このブログにはコメント機能がありません💧お手数おかけしますがTwitterなどでご連絡いただければ幸いです