Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala:类中的额外功能,基于构造函数参数的存在_Scala_Implicit Conversion_Implicit_Type Constraints - Fatal编程技术网

Scala:类中的额外功能,基于构造函数参数的存在

Scala:类中的额外功能,基于构造函数参数的存在,scala,implicit-conversion,implicit,type-constraints,Scala,Implicit Conversion,Implicit,Type Constraints,假设我有一个“基类”,我想给它添加一个“哇”val 但是,“whoa”val只有在我提供了某个构造函数参数(在本例中,该参数是一个函数)时才可用 因此,我创建了一个额外的“WhoaClass”,其中包含方法“whoa”,如果需要,“Base”可以隐式转换为。我只需要检查构造函数参数“func”是否存在(通过检查其类型是否为Null,这就需要在底部附近进行丑陋的破解) 我的问题是:有没有更好的方法?特别是在可读性方面,以及消除丑陋的黑客。我仍然在尝试使用构造函数参数,而不是某种生成器。我真的希望将

假设我有一个“基类”,我想给它添加一个“哇”val

但是,“whoa”val只有在我提供了某个构造函数参数(在本例中,该参数是一个函数)时才可用

因此,我创建了一个额外的“WhoaClass”,其中包含方法“whoa”,如果需要,“Base”可以隐式转换为。我只需要检查构造函数参数“func”是否存在(通过检查其类型是否为Null,这就需要在底部附近进行丑陋的破解)

我的问题是:有没有更好的方法?特别是在可读性方面,以及消除丑陋的黑客。我仍然在尝试使用构造函数参数,而不是某种生成器。我真的希望将“whoa”函数内联到基类中,而不是让它挂在另一个类中,这不是很清楚

object WhoaTest {
    // the type of function I want to take
    type Func = Int => Option[Long]

    // this is the base class that takes a function
    case class Base[A <: Func](func: A = null) {}

    // this is the class with the extra method
    class WhoaClass(a: Long) {
        val whoa = "Whoa" + a.toString
    }

    // the implicit method to convert the base object into a WhoaClass with a whoa method
    implicit def enableWhoa[A <: Func](a: Base[A])
        (implicit ev: A =!= Null) // only enable this implicit if the function is present
        = new WhoaClass(a.func(50).get)

    // the hack for extra scala type checking
    trait =!=[A, B]
    implicit def neq[A, B] : A =!= B = null

    // Causes an ambiguity if the two types are the same
    implicit def neqAmbig1[A] : A =!= A = null
    implicit def neqAmbig2[A] : A =!= A = null
}
对象WhoaTest{
//我想要的函数类型
键入Func=Int=>Option[Long]
//这是接受函数的基类

case-class-Base[A首先,
null
测试在Scala中是一个非常“不寻常”的习惯。然后我认为最好在伴生对象中有一个基本特性和工厂函数

trait Base{/*公共代码,无条件*/}
对象库{
def apply():Base=new Base{}//没有参数时的工厂
def应用(a:长):基准=新基准{
overide lazy val toString=s“哇:$a”
}
}
//那么我可以做。。。
val base1:Base=Base()//第一个应用工厂
val base2:Base=Base(1L)//第二工厂

你到底想做什么?它看起来很像一些伪装成Scala的Java代码--
null
是一个完全免费的东西。我最初有一个抽象特性,名为FuncNotPresent,扩展了Func。然后构造函数参数是
Func:Option[Func]=Option.empty[FuncNotPresent]
我测试了隐式证据不存在,但当Scala中有一个方便的类型晶格为Null提供了一个类型时,所有这些只是增加了代码膨胀。它看起来真的什么都没有(即使是远程的)就像Java代码。很抱歉出现一个奇怪的空值?我建议检查@applicius answer,因为它是纯Scala,我相信它满足您的需要。我的解决方案更像是“Scala”但事实上,他的答案部分是我想要的。它使用的是Scala提供的更复杂的功能。对我来说,这并不是因为它可以做到,而是它应该做到。我认为调整解决方案的复杂性是一个关键点,特别是当其他人可以阅读代码时,或者如果它必须维护的话。我看不出原因寻找更复杂的解决方案。没关系,但还不完全。我想我会在伴生对象中执行工厂函数,但“Base”将是一个类,我会执行
键入BaseWithWhoa=Base with Whoa
(使用Whoa函数使Whoa成为trait),第二个apply函数将返回“BaseWithWhoa”.听起来不错?我不认为有这样的类型成员有什么意义,也许你没有在问题中提到动机。对我来说更简单更好。是的,你建议的一般模式就是我想要的。谢谢。(但是我必须有
类Whoa extensed Base
,然后我从相应的应用程序返回它。)。