#はじめに
初投稿です。
最近Railsを勉強しているのですが、「何この書き方?」というコードに遭遇することが多いです。
ということで復習も兼ねてRails(Ruby)初心者が躓く文法をまとめます。
内容は殆どRails Tutorial4章のまとめです。やっぱり間違いない教材ですね。(8章で挫折した)
#メソッドの括弧は省略できる
Rails Tutorial4章で以下のように書かれています。
実は、Ruby では丸カッコは使用してもしなくても構いません。次の2つの行は等価です。
stylesheet_link_tag('application', media: 'all',
'data-turbolinks-track': 'reload')
stylesheet_link_tag 'application', media: 'all',
'data-turbolinks-track': 'reload'
Rubyにおいては丸括弧の有無で違いはないようです。
もっと簡単な例ですと、以下の2行も等価になります。
puts("Hello Wolrd!")
puts "Hello World!"
さらに言うと、クラス定義で使うattr_accessorにも当てはまります。
#普通の書き方はアクセサ引数の括弧は省略
class Test1
attr_accessor :one, :two
def initialize(one, two)
@one = one
@two = two
end
end
#だけど、括弧をつけても意味は同じ
class Test2
attr_accessor(:one, :two)
def initialize(one, two)
@one = one
@two = two
end
end
つまり、いつも使っているattr_accessorは引数の括弧を省略しているということになります。
実際にインスタンス化して試してみると括弧の有無で同じことがわかります。
test1 = Test1.new("first", "second")
test2 = Test2.new("first", "second")
puts "#{test1.one} #{test1.second}"
puts "#{test2.one} #{test2.second}"
=>first second
=>first second
ちなみに"#{xxx.yyy}"は式展開というもので、ダブルコーテーション内で式を展開できて便利です。
#ハッシュの定義は2パターンある
複数のハッシュを同時に定義する場合は以下のようにします。
test = {:one => "first_value", :two => "second_value"}
puts test[:one]
=>first_value
そして以下のようにも書けます。
test = {one: "first_value", two: "second_value"}
puts test[:one]
=>first_value
Rails Tutorialでもこのことが言及されています。
>どちらの記法もよく使われているので、両方の見分けがつくことが重要です。
ただ最初は少し見分けづらいのも事実です。
例えば:nameはシンボルとして独立していますが、引数を伴わないname:では意味が成り立ちません。
次のコードの:name =>とname:は、ハッシュとしてのデータ構造は全く同じです。
>```
{ :name => "Michael Hartl" }
上のコードと、
{ name: "Michael Hartl" }
>というコードは等価になります。
ここもハマりがちなポイントだと思います。Railsでは後者の書き方をよく見る気がします。
#最後の引数がハッシュの場合は波括弧を省略できる
これに関してはコードを見たほうが早いと思います。
Rails Tutorialから引用です。
>実は、ハッシュがメソッド呼び出しの最後の引数である場合は、波カッコを省略できます。次の2つの行は等価です。
>```
stylesheet_link_tag 'application', { media: 'all',
'data-turbolinks-track': 'reload' }
stylesheet_link_tag 'application', media: 'all',
'data-turbolinks-track': 'reload'
stykesheet_link_tagは外部スタイルシートを指定するリンクタグを生成するメソッドです。
第一引数にスタイルシートへのパス、第二引数にHTMLオプションを指定します。
この第二引数はこのメソッドの最後の引数であることから、ハッシュを定義する際に使う「{}」が省略することができます。
また、以上のコードは途中で改行がなされています。
Rubyでは改行と空白を区別していません。よって改行もただのスペースとみなされます。
→そんなに簡単な話ではないみたいです。ご指摘ありがとうございます。
更に言うとこのコードはメソッドの括弧も省略されています。
私を始め、初心者にはとっつきづらいコードですが、ここまでの内容を踏まえると理解できるかと思います。
#じゃあ結局、全部省略すればいいの?
というわけでもないようです。
コードの意味としては等価ですが、可読性との兼ね合いや慣習等があるみたいですね。
これに関しては以下の記事が参考になるかと思います。あとは経験ですかね。
Rubyコーディングアンチパターン
https://qiita.com/seiya1121/items/6fcd8a1ab332a4f14439
#おわりに
今回はじめて記事を書いてみましたが、色々と調べなおすことがあり勉強になりました。
またハマりがちな文法を見つけたら追記していこうと思います。
また、筆者も完全に初心者なので間違っている箇所が多々あるかとおもいます。
間違いに気づいた際にはそっと指摘して頂けると非常に助かりますので、なにとぞよろしくお願いします。