Rubyのオープンクラス、Pythonists向けのメモ

私自身の経験から、Rubyのオープンクラスはうっとうしく、パイニストの間で誤解を招くことがわかっています。 実際、Stringクラスを開いてそこでサイズをオーバーライドするのは奇妙なことですか?





しかし、一方で問題を検討することもできます。小さな例を試してみましょう。 Pythonでは、さまざまなタイプの真実をチェックする方法を誰もが知っています。空になっているものはすべて嘘です。 ルビーでは、これは当てはまりません;ここでは、falseはnilおよびfalseです。 Pythonのように便利な場合があります。



たとえば、組み込み型のサポートを含む、さびでこれをどのように解決できますか?



trait Existable { fn exist(&self) -> bool; } impl Existable for int { fn exist(&self) -> bool { if *self == 0 { false } else { true } } } fn main () { assert!(5.exist() == true) assert!(0.exist() == false) }
      
      







pythonでスキームが異なることを想像してください。それを実装したいと思います。 Pythonでは、サードパーティクラスの新しいメソッドを定義できないため、次のようなことができます。



 class Trait(object): def __init__(self): self.registry = {} def impl(self, typ): def reg(func): self.registry[typ] = func return func return reg def __call__(self, arg): return self.registry[arg.__class__](arg) Existable = Trait() @Existable.impl(int) def int_exists(i): return False if i == 0 else True if __name__ == '__main__': assert Existable(0) == False assert Existable(5) == True
      
      





さて、または、1分ほどのスケッチよりもインテリジェントなライブラリを使用してください。



rubyはどのようにしてそのようなことを実装しましたか



 class Object # File activesupport/lib/active_support/core_ext/object/blank.rb, line 13 def blank? respond_to?(:empty?) ? empty? : !self end end
      
      







`empty?`メソッドは(少なくとも) `Array`クラスと` Hash`クラスで定義されます。 クラスで定義すると、 `blank?`メソッドが正しく機能します。 つまり、ここにはルビーの特性があります。「空ですか?」に応答するオブジェクトです。「存在可能」と同じ、空の特性チェックを実装します。



これは、Rubyでオープンクラスを使用する最も簡単な正しい例であり、Ruby on Railsの一部の1つであるActiveSupportには他にも多くのすばらしいものがあります。



このような簡単な例のおかげで、Rubyのオープンクラスがまったく悪ではなく、環境拡張機能を適切に実装できる便利なツールであることを理解できたと思います。



意味が完全に明確ではない場合、Rubyのオープンクラスを使用すると、さびやその他の言語の特性を含め、組み込みクラスの動作を再定義できます。



PS私はPythonで同様のメカニズムを実装することは不可能だと主張していません-記事自体に簡単な例を挙げました。 繰り返しますが、私たちはrubyでのオープンクラスの適切な使用について話しているのであって、他の言語に対する言語の利点については話していません。



All Articles