[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.a를 제공 유형이 예상 유형과 일치하지 않는 경우, 범위에있는 방법에 대한 스칼라 컴파일러 외모는 매개 변수 및 반환 등의 결과로 예상되는 유형을 제공하는 형식을 취 것을 암시 적으로 표시. 발견하는 경우, 그것은 사이에서 메서드 호출을 삽입합니다. 의 BIGINT 경우에는이 방법이 있다고
a를 제공 유형이 예상 유형과 일치하지 않는 경우, 범위에있는 방법에 대한 스칼라 컴파일러 외모는 매개 변수 및 반환 등의 결과로 예상되는 유형을 제공하는 형식을 취 것을 암시 적으로 표시. 발견하는 경우, 그것은 사이에서 메서드 호출을 삽입합니다. 의 BIGINT 경우에는이 방법이 있다고
doSomethingWithBigInt(d:BigInt)=....
그리고 당신은 정수로 전화 :
doSomethingWithBigInt(10)
유형이 일치하지 않기 때문에, 스칼라 컴파일러는 생성합니다 :
doSomethingWithBigInt(int2bigInt(10))
암시 적 int2bigInt 가정하면 범위에
-
==============================
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.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
나는 왜 (많은 이해 나는 사람에게 문자열로 변환 생각하지 않는 것이하지만 그것의 가치 그림) 하나의 암시 적 변환을 사용하고자 할 방법이 예제 관계를 설명을 바랍니다.
from https://stackoverflow.com/questions/2861501/can-someone-explain-me-implicit-conversions-in-scala by cc-by-sa and MIT license
'SCALA' 카테고리의 다른 글
[SCALA] 스칼라의 인수로 유닛 인수없이 기능, (0) | 2019.12.09 |
---|---|
[SCALA] 추상 형식의 멤버 콘크리트 클래스 (0) | 2019.12.07 |
[SCALA] SparkSQL - 읽기 마루 파일을 직접 (0) | 2019.11.30 |
[SCALA] 스칼라 등 구현 ifTrue, ifFalse, ifSome, ifNone은 피하는 경우 (...) 단순 패턴 매칭 (0) | 2019.11.29 |
[SCALA] "합니다 MyType"문제 :해야합니까 실제 클래스를 반환하는 스칼라에서 추상적 인 유형 (또는 제네릭)를 사용해야? (0) | 2019.11.28 |