[Ruby][Sorbet] selfが迷子の時はT.bind

moduleやlambdaでselfが参照できないときにはT.bind使えばとりあえずは解決します(解決といえるかわかりませんが…)。

AモジュールがB, Cクラスに依存している場合

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# typed: true
class B
  def hoge
  end
end

class C
  def hoge
  end
end

module A
  extend T::Sig
  extend ActiveSupport::Concern

  sig { returns(T.any(B, C)) }
  def _self
    T.bind(self, T.any(B, C))
  end

  def fuga
    _self.hoge
  end
end

静的には確認されませんがRuntimeでは確認されます。
なので、コード実行時に異なる型が来た場合にはTypeErrorがraiseされます。

公式からそのまま持ってきていますが↓のようにlambdaからメソッド参照できないときはT.bindを使って解決するのが正攻法です。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
class Post
  before_create :set_pending, if: -> {
    T.bind(self, Post)
    draft?
  }

  def draft?
    true
  end
end
Built with Hugo
テーマ StackJimmy によって設計されています。