복붙노트

[SCALA] 누군가가 나에게 스칼라에서 암시 적 변환을 설명 할 수 있습니까?

SCALA

누군가가 나에게 스칼라에서 암시 적 변환을 설명 할 수 있습니까?

그리고 더 구체적에서 BigInt가에서 BigInt로 변환 INT 작동 않는 방법?

소스 코드에서 읽

...
implicit def int2bigInt(i: Int): BigInt = apply(i)
...

이 코드는 어떻게 호출?

"날짜 리터럴"작동 :이 다른 샘플 방법을 이해할 수있다.

에서.

val christmas = 24 Dec 2010  

정의 :

implicit def dateLiterals(date: Int) = new {
  import java.util.Date  
  def Dec(year: Int) = new Date(year, 11, date)
}

INT가 매개 변수로 int 형으로 메시지 십이 전달 된 것 도착하면,이 경우 12 월, 요청을 처리 할 수있는 다른 방법에 대한 시스템 외모 (년 : INT)

Q1. 날짜 리터럴에 대한 이해의 암 I 권리?

Q2. 어떻게에서 BigInt 적용됩니까?

감사

해결법

  1. ==============================

    1.a를 제공 유형이 예상 유형과 일치하지 않는 경우, 범위에있는 방법에 대한 스칼라 컴파일러 외모는 매개 변수 및 반환 등의 결과로 예상되는 유형을 제공하는 형식을 취 것을 암시 적으로 표시. 발견하는 경우, 그것은 사이에서 메서드 호출을 삽입합니다. 의 BIGINT 경우에는이 방법이 있다고

    a를 제공 유형이 예상 유형과 일치하지 않는 경우, 범위에있는 방법에 대한 스칼라 컴파일러 외모는 매개 변수 및 반환 등의 결과로 예상되는 유형을 제공하는 형식을 취 것을 암시 적으로 표시. 발견하는 경우, 그것은 사이에서 메서드 호출을 삽입합니다. 의 BIGINT 경우에는이 방법이 있다고

    doSomethingWithBigInt(d:BigInt)=....
    

    그리고 당신은 정수로 전화 :

    doSomethingWithBigInt(10)
    

    유형이 일치하지 않기 때문에, 스칼라 컴파일러는 생성합니다 :

    doSomethingWithBigInt(int2bigInt(10))
    

    암시 적 int2bigInt 가정하면 범위에

  2. ==============================

    2.암시 물건의 요점은 그것을 할 단 하나의 올바른 방법이 분명히있을 때 상용구 물건을 지루한을 작성하는 것입니다.

    암시 물건의 요점은 그것을 할 단 하나의 올바른 방법이 분명히있을 때 상용구 물건을 지루한을 작성하는 것입니다.

    암시 적 매개 변수의 경우, 컴파일러는 당신이 생각하고 무엇을해야 문맥에서 매개 변수를 삽입합니다. 예를 들어,

    case class TaxRate(rate: BigDecimal) { }
    implicit var sales_tax = TaxRate(0.075)
    def withTax(price: BigDecimal)(implicit tax: TaxRate) = price*(tax.rate+1)
    
    scala> withTax(15.00)
    res0: scala.math.BigDecimal = 16.1250
    

    우리가 암시 적 매개 변수로 세율을 표시하고, 필요한 경우에 채워 넣을 수있는 암시 적 변수를 제공 한 이후, 우리는 세율을 지정할 필요가 없습니다. 컴파일러는 자동적 withTax 채운다 ​​(16,500) (sales_tax)

    암시 적 변환의 경우, 그것이 가지고있는 유형을 가지고이 필요한 유형으로 변환 할 수있는 방법에 대한 컴파일러 보인다. 당신은 당신이 한 번에 필요에 도착하기 때문에,이 변환은, 정상적인 상황에서 체인 할 수 없습니다.

    암시 적 변환은 놀이로 올 가능성이 두 가지 경우가 있습니다. 유형이 잘못되면,하지만 다음 컴파일러는 당신을 위해 변환합니다 (정확히 하나의 방법으로) 적절한 형식으로 변환 할 수있다 - 하나는 메소드 호출의 매개 변수입니다. 다른 하나는 메소드 호출의 존재에 - 실제로 사용 유형이 방법을 사용할 수는 없지만, 그 방법을 가지고 형식으로 변환 할 수 있다면, 다음 변환이 일어날 것이다 다음 방법은 것입니다 불리다.

    각각의 예에서 살펴 보자.

    implicit def float2taxrate(f: Float) = TaxRate(BigDecimal(f))
    scala> withTax(15.00)(0.15f)
    res1: scala.math.BigDecimal = 17.250000089406967200
    

    여기, 우리는 0.15f의 명시 적 세율을 호출합니다. 즉 유형 TaxRate이어야 매개 변수를 일치하지 않지만, 컴파일러는 우리가 암시 float2taxrate를 사용하여 세율로 수레를 켤 수 있음을 본다. 그래서 withTax를 호출, 우리를 위해 그것을 않습니다 (15.00) (float2taxrate (0.15f))

    이제 다른 예.

    class Currency(bd: BigDecimal) {
      def rounded = bd.setScale(2,BigDecimal.RoundingMode.HALF_EVEN)
    }
    implicit def bigdec2currency(bd: BigDecimal) = new Currency(bd)
    scala> withTax(15.00)(0.15f).rounded
    res66: scala.math.BigDecimal = 17.25
    

    하나를 호출 할 수 없어야 withTax (15.00) (0.15f) 그래서 (이 BigDecimal를을 반환로)의 BigDecimal은 둥근 방법이 없습니다. 그러나 우리는, 둥근 방법을 가지고 통화 및 통화에 대한 변환을 정의한 모든 세부 사항의 암시 적 변환 채우기 때문에 :. bigdec2currency (withTax (15.00) (0.15f)) 둥근.

    예를 들어, 7에서 BigInt + (5)를 추가하려고 시도 할 때 BIGINT의 지능에의 변환의 경우에, 컴파일러는 사용된다. (7)는 지능과 지능은에서 BigInt에 자신을 추가하는 방법을 모르는 -이 정상적으로 작동하지 않을. 그러나에서 BigInt는 방법을 가지고 + 그것은 또 다른에서 BigInt에 자신을 추가 할 수 있습니다. 그리고 컴파일러 만이에서 BigInt 7을 변환 할 수 있다면, 그것은 그 방법을 사용할 수 있다고 본다. 이 int2bigInt (7)에서 BigInt + (5)에 + 7에서 BigInt (5)를 변환하므로 암시 적 변환, 즉 변환 할 수있다.

    (참고 :) 당신이에서 BigInt을 작성할 수 있습니다 무엇입니까의 BIGINT 객체의 int) 메소드 (5 :. int2bigInt은 그래서는 (I를 적용 할 차례의 연기에 그것을 BigInt._을 가져가 그리고 그것을 사용하는 BIGINT의 내부 정의 그것은 (오히려 자바의 BigInteger와 같은 문자열을 전달하는 것보다) 일 수 있습니다.)

  3. ==============================

    3.GClaramunt의 대답 @ 보완.

    GClaramunt의 대답 @ 보완.

    간단하게 그것의 방법을 이해하고 전체 예제를 확인하여이 개념을 이해하기 때문에 :

    // define a class
    case class Person(firstName: String, lastName: String)
    
    // must import this to enable implicit conversions
    import scala.language.implicitConversions
    
    // define the implicit conversion. String to Person in this case
    implicit def stringToPerson(name:String) = {
      val fields = name.split(" ");
      Person(fields(0), fields(1))
    }
    
    // method using the implicit conversion  
    def getPerson(fullName:String): Person = fullName
    
    val fooBar = getPerson("foo bar")
    println(fooBar.getClass())  // class Person
    println(fooBar.firstName)  // foo
    println(fooBar.lastName)  // bar
    

    나는 왜 (많은 이해 나는 사람에게 문자열로 변환 생각하지 않는 것이하지만 그것의 가치 그림) 하나의 암시 적 변환을 사용하고자 할 방법이 예제 관계를 설명을 바랍니다.

  4. from https://stackoverflow.com/questions/2861501/can-someone-explain-me-implicit-conversions-in-scala by cc-by-sa and MIT license