2年ぶりに業務でRubyを書きはじめたので、改めてruby-style-guideを読んだら知らなかったことがイロイロあったのでメモ。
2019/02/28当時の日本語版: 2bac495を読みました。
class FooError < StandardError
end
class FooError < StandardError; end
FooError = Class.new(StandardError)
「悪くない例」を書きがちだったので。
arr = [1, 2, 3]
for elem in arr do
puts elem
end
elem
arr.each { |elem| puts elem }
elem
なんとなく、「Rubyでfor文は使わないものだ」という認識はあったし、実際for文は使ったことがなかったけど、なんで使わないのか、避けるべき理由は何なのかを意識していませんでした。
↑の例に書いてあるようにfor文内でつかった変数が、外に漏れ出てくるのはなんかのきっかけでハマりそうだし、やっぱりfor文は避けるべきなんだなと思いました。
'%d %d' % [20, 10]
sprintf('%d %d', 20, 10)
sprintf('%<first>d %<second>d', first: 20, second: 10)
format('%d %d', 20, 10)
format('%<first>d %<second>d', first: 20, second: 10)
単純に String#%
の存在を知らなかったです。 (推奨されてないし、あえてこれから使おうとは思わないですが)
format('Hello, %{name}', name: 'John')
format('Hello, %<name>s', name: 'John')
どっちの記法も知りませんでした。
%w[one two three] * ', '
%w[one two three].join(', ')
Array#*
を知りませんでした。(使わないけど)
some_hash.count
some_hash.size
これも知りませんでした。
標準ライブラリはこのルールに従うかもですが、ActiveRecord とか外部ライブラリだとまたルールが異なってきそうなので、結局のところdocumentなりソースなりをちゃんと読むべきな気がしました。
class Person
attr_accessor :first_name, :last_name
def initialize(first_name, last_name)
@first_name = first_name
@last_name = last_name
end
end
Person = Struct.new(:first_name, :last_name) do
end
Struct.new
にブロックを渡せることを、知りませんでした。
こういうふうに使えそうですね。
Person = Struct.new(:first_name, :last_name) do
def full_name
"#{first_name} #{last_name}"
end
end
p = Person.new('Hoge', 'Fuga')
p.full_name
ただ、メソッドを用意する必要があるような場合は Classを使うような気もするので、使いどころが多いかは分からないです。
fail SomeException, 'message'
raise SomeException, 'message'
「自分が例外を射出するときは fail
、 rescue
などで補足した例外を再射出するときは raise
」のような使い分けがあった気がしましたが、今は全部 raise
で良いようでした。
code = <<-RUBY.strip_margin('|')
|def test
| some_method
| other_method
|end
RUBY
code = <<-RUBY
def test
some_method
other_method
end
RUBY
code = <<~RUBY
def test
some_method
other_method
end
RUBY
<<~
で書くヒアドキュメントを知りませんでした。
/(first|second)/
/(?:first|second)/
これも単純に知らなかったシリーズ
まだまだ知らないことが多く、たまに読み返すと学びがあって良いなと思いました(小並感)