Ruby on Rails 5 超入門 の不思議
作成 2017-05-28 | 更新 2017-05-28 18:50ふたたび
「Ruby on Rails 5 超入門」掌田津耶乃(著)
の話
Amazon のレビューが増えていた。
MyDataクラスのinitializeメソッドの定義の不思議
投稿者 Amazon Customer 投稿日 2017/5/10
形式: 単行本 Amazonで購入
P132の、MyDataクラスのinitializeメソッドの定義の仕方。
そうそう。これも奇妙なやつだった。
このメソッドだけ抜き出して、rubocop に評価させてみる。
user@somewhere:~/labo/rails$ cat a.rb
class MyData
attr_accessor :msg
attr_accessor :name
attr_accessor :mail
def initialize msg:msg, name:name, mail:mail
self.msg = msg
self.name = name
self.mail = mail
end
end
user@somewhere:~/labo/rails$ rubocop --force-default-config -l -D a.rb
Inspecting 1 file
W
Offenses:
a.rb:6:22: W: Lint/CircularArgumentReference: Circular argument reference - msg.
def initialize msg:msg, name:name, mail:mail
^^^
a.rb:6:32: W: Lint/CircularArgumentReference: Circular argument reference - name.
def initialize msg:msg, name:name, mail:mail
^^^^
a.rb:6:43: W: Lint/CircularArgumentReference: Circular argument reference - mail.
def initialize msg:msg, name:name, mail:mail
^^^^
1 file inspected, 3 offenses detected
user@somewhere:~/labo/rails$
self.method も明示する必要性を感じないし、動的な処理をセッターにやらせているわけでもないし。
普通だったら次のように直接インスタンス変数に代入する。
user@somewhere:~/labo/rails$ cat b.rb
class MyData
attr_accessor :msg, :name, :mail
def initialize(msg, name, mail)
@msg, @name, @mail = msg, name, mail
end
end
user@somewhere:~/labo/rails$ rubocop --force-default-config -l -D b.rb
Inspecting 1 file
.
1 file inspected, no offenses detected
user@somewhere:~/labo/rails$
つぎのような値にしたかったのではないかな?
user@somewhere:~/labo/rails$ cat c.rb
class MyData
attr_accessor :msg, :name, :mail
def initialize( msg: 'msg', name: 'name', mail: 'mail' )
@msg, @name, @mail = msg, name, mail
end
end
md = MyData.new(msg: 'hello world', name: 'guess')
p md
user@somewhere:~/labo/rails$ ruby c.rb
#<MyData:0x0055a3b9290330 @msg="hello world", @name="guess", @mail="mail">
user@somewhere:~/labo/rails$
名前付き引数の欠損があって呼び出されても大丈夫。
うーん。でもここで必要性なんて感じない。
if then の不思議
掌田津耶乃さんという作者
投稿者プロフィール2017年5月13日
形式: 単行本
掌田津耶乃という作者は過去出版された著作を見て分かる通り初心者に向けて浅く広く手がけている作者です
つまり入門の専門家であって深く理解して書いているわけじゃありません
ですのでRailsとはなにか?少し触ってみようという方ならこの本は合っていると思います。
この本全体で、ずっと if には then が伴って使われている。
なんか奇妙だよ。
巻末の「Ruby言語超入門」 基本構文の説明
P499
if 条件 then
正しいとき実行する処理
end
普通、ruby の if で then は書かない。
読書中は「Rails だとそう書くのかな?」と思って疑問を封じ込めた。
しかし調べてみるとやっぱり then は書かない。
RubyとRailsのベストプラクティス
ちなみに、Rubyでは「引数のないメソッド定義は丸カッコを省略」
「引数のあるメソッド定義は丸カッコを書く」なのだが、
この本は、すべてのメソッド定義で丸カッコを省略している。
それはそれで初心者向けとしてはいいのかもしれない。