scala:操作重载和隐式转换澄清

scala:操作重载和隐式转换澄清,scala,Scala,下面是一个代码示例。不知道为什么我在使用乘法时出错。 我应该将隐式转换添加到Int吗?当然答案很简单!! 谢谢 您的隐式转换函数是Fraction类的成员-因此,如果没有Fraction的实例,就无法调用它。如果将其移动到对象,它将按预期工作: object Fraction { def apply(x: Int, y: Int) = new Fraction(x, y) implicit def int2Fraction(n: Int) = Fraction(n, 1) }

下面是一个代码示例。不知道为什么我在使用乘法时出错。 我应该将隐式转换添加到Int吗?当然答案很简单!! 谢谢


您的隐式转换函数是Fraction类的成员-因此,如果没有
Fraction的实例,就无法调用它。如果将其移动到
对象
,它将按预期工作:

object Fraction {
    def apply(x: Int, y: Int) = new Fraction(x, y)
    implicit def int2Fraction(n: Int) = Fraction(n, 1)
}

您的隐式转换函数是Fraction类的成员-因此,如果没有
Fraction
的实例,就无法调用它。如果将其移动到
对象
,它将按预期工作:

object Fraction {
    def apply(x: Int, y: Int) = new Fraction(x, y)
    implicit def int2Fraction(n: Int) = Fraction(n, 1)
}

要进行隐式转换,它需要在范围内。试着像这样在课堂外学习:

implicit def int2Fraction(n: Int) = Fraction(n, 1)

class Fraction(val x:Int, val y:Int)
{
    def X = x
    def Y = y


    def *(that: Fraction) : Fraction = new Fraction(that.X * X, that.Y * Y)
}

object Fraction {
    def apply(x: Int, y: Int) = new Fraction(x, y)
}

你也可以把它放在同伴对象里面;编译器会自动在那里搜索。

要进行隐式转换,它需要在作用域中。试着像这样在课堂外学习:

implicit def int2Fraction(n: Int) = Fraction(n, 1)

class Fraction(val x:Int, val y:Int)
{
    def X = x
    def Y = y


    def *(that: Fraction) : Fraction = new Fraction(that.X * X, that.Y * Y)
}

object Fraction {
    def apply(x: Int, y: Int) = new Fraction(x, y)
}

你也可以把它放在同伴对象里面;编译器会自动在那里搜索。

已更新。只是刷新页面更新。只是刷新页面哦。。我明白了,这才是真正的答案。顺便说一句,这很明显!哦我明白了,这才是真正的答案。顺便说一句,这很明显!答案也是正确的。将转换保持在类定义之外是有意义的。隐式转换不受singleton related范围的限制有什么原因吗?因为您可以对不同的范围/上下文使用不同的隐式转换。在给定范围的情况下,您可能希望以不同的方式解释同一对象(无论出于何种原因),然后可以在每个范围中导入正确的转换。回答也正确。将转换保持在类定义之外是有意义的。隐式转换不受singleton related范围的限制有什么原因吗?因为您可以对不同的范围/上下文使用不同的隐式转换。您可能希望在给定范围的情况下以不同的方式解释同一对象(无论出于何种原因),然后可以在每个范围中导入适当的转换。