加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala适用于没有参数

发布时间:2020-12-16 09:07:38 所属栏目:安全 来源:网络整理
导读:我想创建一个在请求时生成随机内容的程序,例如下面示例中的字母.我已经定义了一个带有伴随对象的抽象类来返回其中一个子类. abstract class Letter class LetterA extends Letter { override def toString = "A" } class LetterB extends Letter { override
我想创建一个在请求时生成随机内容的程序,例如下面示例中的字母.我已经定义了一个带有伴随对象的抽象类来返回其中一个子类.

abstract class Letter

  class LetterA extends Letter {
    override def toString = "A"
  }
  class LetterB extends Letter {
    override def toString = "B"
  }
  class LetterC extends Letter {
    override def toString = "C"
  }

  object Letter {
    def apply = RNG.d(3) match {
      case 1 => new LetterA
      case 2 => new LetterB
      case 3 => new LetterC
    }
    override def toString = "Random Letter"
  }

我的梦想是,我将能够使用Letter来获得A,B或C类型的随机字母.但是使用此代码,它只会给我一个字母对象. Letter.apply给了我A,B或C但是很难看.

如果我将apply函数更改为apply()然后事情会好一点,因为我可以使用Letter()来获取我的随机字母之一,但Letter仍然给了我这个对象.

有什么我可以做的,所以给Letter写的东西实际上解析为LetterA,LetterB或LetterC之一?

解决方法

回答你的问题是不,你不能区分Letter.type和Letter.apply,所以你需要一个解决方法.

我建议你使用Type-Class模式,它比为随机对象添加随机生成的apply方法更加灵活.

trait RandomGenerator[T] {
    def gen: T        
  } 

  implicit object RandomLetter extends RandomGenerator[Letter] {

    private val rnd = new Random()

    def gen = (rnd.nextInt(3) + 1) match {
      case 1 => new LetterA
      case 2 => new LetterB
      case 3 => new LetterC
    }
  }

  def random[T: RandomGenerator]: T = 
    implicitly[RandomGenerator[T]].gen


  println(random[Letter])
  println(random[Letter])
  println(random[Letter])

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读