11
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

updated at

Ruby でも Optional Chaining がしたいんじゃ〜!

もう type = database.first ? database.first.type : nil とかみたいに書くのはつかれたお……。
Swift みたいに type = database.first?.type って書きたいお……。

というわけでなるべくお手軽に実装。
(NilClass で method_missing して nil を返すと Swift の実装に近づくが、確実にデバッグで死ぬのでおすすめしない)

2015/12/09 追記。
Ruby 2.3.0 から safe navigation operator が実装されましたね。(参考

foo = Foo.new
p foo&.hello

ActiveRecord でいえば try! のほうなので、注意は必要ですが標準でサポートされたというのは大きいと思います。


class Object
  def _?
    self
  end
end

class NilClass
  class Ghost < BasicObject
    def method_missing(*argv)
      nil
    end
  end

  def _?
    @@ghost ||= Ghost.new
    @@ghost
  end
end

class Foo
  def hello
    "hello"
  end

  def foo
    Foo.new
  end
end

foo = Foo.new
p foo._?.hello          # => "hello"
p foo._?.foo._?.hello   # => "hello"

foo = nil
p foo._?.hello          # => nil
p foo._?.foo._?.hello   # => nil

オブジェクトを _? でつなげれば、中身があればそのまま返して、nil なら nil を返すぞ!
_ という名前にしてもいいが、 ? をつければなんとなくわかりやすいかもしれない。
実際に使うならもっとまともな名前をつけような!

ActiveSupportのtryとどっちがいいかは一考の余地あり

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
11
Help us understand the problem. What are the problem?