はじめに
Railsチュートリアルで私が一番苦手な分野である第4章をアウトプットのために記述していく
最近プログラミング始めたビギナーなので間違いがあったら先輩方に訂正していただきたい
この記事をかなり参考にした
https://qiita.com/take_webengineer/items/265f29b77f3126d3a9df
単純なオブジェクト指向(?)のはなし
・クラスの下にインスタンスがある(Stringクラスの中に"foobar"という文字列がある)
・詳しくはこちらのサイトが解説している(スマホの例がわかりやすい) https://type.jp/et/feature/25261/
・メソッドとは、オブジェクトに渡されるメッセージ( "foobar".length のlengthがメソッド)
・Rubyはメソッドの引数のカッコ()を省略して記述できる。
・ハッシュがメソッド呼び出しの最後の引数である場合は、波カッコを省略できる
# メソッド呼び出しの丸カッコは省略可能。
stylesheet_link_tag("application", "data-turbo-track": "reload")
# 上は以下のように書いても同じ
stylesheet_link_tag "application", "data-turbo-track": "reload"
# 最後の引数がハッシュの場合、波カッコは省略可能。
stylesheet_link_tag("application", { "data-turbo-track": "reload" })
# 上は以下のように書いても同じ
stylesheet_link_tag("application", "data-turbo-track":
クラス(まじ苦手)
class Word < String # WordクラスはStringクラスを継承する
def palindrome?
self == self.reverse # selfは文字列自身を表します
end
end
=> :palindrome?
s = Word.new("level") # 新しいWordを作成し、"level" で初期化する
=> "level"
s.palindrome? # Wordが回文かどうかを調べるメソッド
=> true
s.length # WordはStringで扱える全てのメソッドを継承している
=> 5
・このコードのWord.new("level")は、Wordクラスの直下に"level"文字列を入れるということ
・s = String.new("foobar")のときとイメージは同じ(このコードの意味はs = "foobar")
・超極論だがs = Word.new("level")は s = "level" である。(最後のコードは "level".lengthと同じだね)
・String→Word→level(文字列)と継承しているため、Wordクラス直下は文字列であり、文字列を扱えるすべてのメソッドを継承していることになる
眠いので朝起きたら続きの組み込みクラスから勉強する
→おきた
組み込みクラス
・組み込みクラスは元からRailsにあるクラス(Object,String等)
・組み込みクラスにメソッドを追加することは基本的にない
・ただRailsではデフォでblank?という空白を判定するメソッドがRubyに追加されている
ユーザークラス
class User
attr_accessor :name, :email
def initialize(attributes = {})
@name = attributes[:name]
@email = attributes[:email]
end
def formatted_email
"#{@name} <#{@email}>"
end
end
・ルートディレクトリにrbファイルを作成し、その中でクラスの定義を行う(ルートディレクトリは一番上位のディレクトリ Sample_appの直下)
attr_accessor :name, :email
・このコードはユーザー名とメールアドレス(属性: attribute)に対応するアクセサー(accessor) をそれぞれ作成している
・これを作成する理由は、「外部から変数を参照するため」と「外部から変数を編集するため」です(外部とは違うファイルのこと)
もしこのコードがなかった場合
# Userインスタンスを作成
user = User.new('鈴木', 33)
# 下記のように外部から直接参照しようとするとエラーになる
puts user.name
# もしくは
puts user.age
外部からputsを使って参照しようとしてもエラーになり参照できない。
# Userインスタンスを作成
user = User.new('田中', 23)
# 下記のように外部から直接変更しようとするとエラーになる
user.name = '佐藤'
# もしくは
user.age = 45
変更の場合も同様で、 = を使って違う値を代入しようとしてもすることができない。
そこで先ほどのコードを記述することにより
# Userインスタンスを作成
user = User.new('鈴木', 33)
# 下記のように参照できるようになる
puts user.name #=> '鈴木'
puts user.age #=> 33
# 下記のように変更できるようになる。
user.name = '田中'
user.age = 56
puts user.name #=> '田中'
puts user.age #=> 56
先ほどエラーが出たものも、外部から操作ができるようになる。
以上のコード含めこちらの記事を参照させていただいた
https://qiita.com/soicchi/items/5d64bc49d0e16c7602a3
def initialize(attributes = {})
@name = attributes[:name]
@email = attributes[:email]
end
・このinitializeメソッドは、User.newが実行されると自動で呼び出される
・attributeという引数を1つ持っている
・attributes変数は空のハッシュをデフォルトの値として持つため、名前やメールアドレスのないユーザーを作ることができます。
def formatted_email
"#{@name} <#{@email}>"
end
・これは文字列を生成するだけ
・名前 <メールアドレス>となる