めたらーのブログ別館

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では「引数のないメソッド定義は丸カッコを省略」
「引数のあるメソッド定義は丸カッコを書く」なのだが、
この本は、すべてのメソッド定義で丸カッコを省略している。
それはそれで初心者向けとしてはいいのかもしれない。

関連タグ

書評
小さいデバイスで表示される

Copyright © めたらー


一番上へ | 一番下へ