こんにちは、hachi8833です。以下の「Rubyスタイルガイド」記事の元であるRubocopスタイルガイドをチェックしたところ、いくつか追加更新がありましたので、スペースなどのトリビアな修正以外のものをリストアップしてみました。更新は以下のRubyスタイルガイドにも反映しました。
追加されたスタイル
キーワード引数に関するスタイルが追加されています。Rubyコミッターが審議中の「キーワード引数の現状と将来構想 - HackMD」と直接関連しているかどうかはわかりませんが、いわゆる=
を使うデフォルト値付き引数やopt={}
のようなオプションハッシュ引数の位置付けが下がり、キーワード引数が推奨されつつある流れのように思えます。
⚓追加1. メソッドの引数に論理値を渡す場合はキーワード引数を使うこと
- PR: keyword arguments for boolean arguments by ruba-ruba · Pull Request #509 · rubocop-hq/ruby-style-guide
- commit: Refine a rule · rubocop-hq/ruby-style-guide@341fc30
# bad
def some_method(bar = false)
puts bar
end
# bad - これはキーワード引数導入前によく用いられていたハック
def some_method(options = {})
bar = options.fetch(:bar, false)
puts bar
end
# good
def some_method(bar: false)
puts bar
end
some_method # => false
some_method(bar: true) # => true
bar = false
というデフォルト値付き引数での指定がbadとされています。Rubocopのdefault.ymlにはまだそれらしいものが見当たりません。
⚓追加2. オプション引数(デフォルト値付き引数)よりキーワード引数が望ましい
- PR: keyword arguments for boolean arguments by ruba-ruba · Pull Request #509 · rubocop-hq/ruby-style-guide
- commit: Prefer keyword arguments over optional arguments · rubocop-hq/ruby-style-guide@508e506
# bad
def some_method(a, b = 5, c = 1)
# (略)
end
# good
def some_method(a, b: 5, c: 1)
# (略)
end
b = 5
のようなデフォルト値付き引数がbadとされています。Rubocopのdefault.ymlにはそれらしいものはありませんが、Rails向けのHttpPositionalArguments
が近いようです。
Rails/HttpPositionalArguments:
Description: 'Use keyword arguments instead of positional arguments in http method calls.'
Enabled: true
VersionAdded: 0.44
Include:
- 'spec/**/*'
- 'test/**/*'
更新されたスタイル
⚓更新1.「2項演算子の定義」の記述が追加
3-12【統一】2項演算子の定義では引数をotherに揃えるに該当します。
2項演算子や演算子的なメソッドを定義する場合、右辺と左辺がセマンティクス上対称(同じまたはcoercion可能)であればパラメータ名を
other
で統一する。
* セマンティクスが対称な演算子または演算子的メソッド(引数をother
にすべき):+
、-
、*
、/
、%
、**
、==
、>
、<
、|
、&
、^
、eql?
、equal?
* セマンティクスが非対称な演算子(引数をother
にすべきではない):<<
、[]
、===
このルールは、演算子の両辺のセマンティクスが同じ場合にのみ適用すること。Rubyコアでの重要な例外としてはArray#*(int)
がある。
ruby-style-guideより大意
# good
def +(other)
# (略)
end
# bad
def <<(other)
@internal << other
end
# good
def <<(item)
@internal << item
end
# bad
# ある文字列を`other`倍したものを返す
def *(other)
# (略)
end
# good
# ある文字列を`num`倍したものを返す
def *(num)
# (略)
end
⚓更新2. APIドキュメントの指定がRDocからYARDに変更された
「1-22【統一】APIドキュメントにはYARDを使う」に反映しました。
ツィートより
これはいい流れ https://t.co/ldHPItfqwg
— toshimaru (@toshimaru_e) October 4, 2018