development

C #의 확장 메서드에 해당하는 Scala?

big-blog 2020. 12. 28. 22:24
반응형

C #의 확장 메서드에 해당하는 Scala?


C #에서는 다음과 같이 작성할 수 있습니다.

using System.Numerics;
namespace ExtensionTest {
public static class MyExtensions {
    public static BigInteger Square(this BigInteger n) {
        return n * n;
    }
    static void Main(string[] args) {
        BigInteger two = new BigInteger(2);
        System.Console.WriteLine("The square of 2 is " + two.Square());
    }
}}

이 간단한 확장 방법 은 Scala에서 어떻게 생겼을까 요?


포주 내 라이브러리 패턴은 유사한 구조입니다 :

object MyExtensions {
  implicit def richInt(i: Int) = new {
    def square = i * i
  }
}


object App extends Application {
  import MyExtensions._

  val two = 2
  println("The square of 2 is " + two.square)

}

@Daniel Spiewak의 의견에 따르면 메서드 호출에 대한 반영을 피하고 성능을 지원합니다.

object MyExtensions {
  class RichInt(i: Int) {
    def square = i * i
  }
  implicit def richInt(i: Int) = new RichInt(i)
}

Scala 2.10 버전부터 전체 클래스를 암시 적 변환에 적합하게 만들 수 있습니다.

implicit class RichInt(i: Int) {
  def square = i * i
}

또한 AnyVal을 확장하여 확장형의 인스턴스 생성을 피할 수 있습니다.

implicit class RichInt(val i: Int) extends AnyVal {
  def square = i * i
}

암시 적 클래스 및 AnyVal, 제한 사항 및 단점에 대한 자세한 내용은 공식 문서를 참조하세요.


이것은 Daniel의 주석 이후의 코드 입니다.

object MyExtensions {
    class RichInt( i: Int ) {
        def square = i * i
    }
    implicit def richInt( i: Int ) = new RichInt( i )

    def main( args: Array[String] ) {
        println("The square of 2 is: " + 2.square )
    }
}

Scala 에서는 (키워드가 아닌) 문자열 검색을 사용하는 경우 웹에서 많이 논의되고 찾기 쉬운 소위 (언어의 발명가에 의해) Pimp My Library 패턴을 사용합니다.

참조 URL : https://stackoverflow.com/questions/3119580/scala-equivalent-of-cs-extension-methods

반응형