暗黙的な変換:ダイナミックタイプよりも強力ですか?


詳細
本文の内容は主にImplicit Conversions:More Powerful than Dynamic Type?から来ています.私はその一部だけを翻訳しました.
暗黙的変換は、[url=Haskell type classes]Scala[/url]で実装されるHaskell type classesに類似したタイプのシステムであり、Scalaのような静的タイプの言語にいくつかの「動的」特性をもたらす.以下、具体例を用いて説明する.
ケース1:
Stringにreduceメソッドを追加し、文字列の大文字からなる新しい文字列を返します.
Scalaでは、最終的な効果は次のとおりです.
//Scala
val acronym = "Microsoft Certified Systems Engineer".reduce
println(acronym)            // MCSE

StringはJava言語に組み込まれたタイプであるため、静的言語では実行時に既存のクラスにメソッドを動的に追加できないという問題が発生しています.
Scalaでは、既存のタイプから新しいタイプへの暗黙的な変換を行うために必要なメソッドを持つ新しいタイプを定義できます.その後、Scalaコンパイラは背後で魔法を実施します.コードは次のとおりです.
class MyStr(str:String) {
    def reduce = str.foldLeft(""){ (s,c) =>
                     if(c.isUpperCase) s+c else s
                 }
}

implicit def str2MyStr(str:String) = new MyStr(str)

対照としてRubyでの実装を見てみましょう.
class String
  def reduce
    arr = unpack('c*').select { |c| (65..90).include? c }
    arr.pack 'c*'
  end
end
 
puts 'HyperText Transfer Protocol'.reduce       # HTTP

ケース2:
少し複雑な問題:整数タイプのリロード
<
オペレータは、Stringと比較できるようにしますが、Stringの長さが整数より小さい場合はtrueを返します.そうでない場合はfalseを返します.
Scalaにおいても同様に暗黙的変換機構によってこの問題を解決することができる.今回は、上記よりも簡潔な形式を使用しました.
//Scala,that's all
implicit def lessThanOverload(i: Int) = new {
    def  
 
   Ruby , Fixnum :
class Fixnum
  def  
 
   , 。    :
class Fixnum
  def = str.size
  end
end

はスタックオーバーフローの はありませんが、 しい が しました.

irb(main):006:0> 123 < 'test'
=> true
irb(main):007:0> 123 < 123
=> true
この の Ruby はこうです.
class Fixnum
  alias_method :__old_less_than__, ' 
 
   , Scala,Ruby 。