- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
为了引入更多类型安全性,我们可以使用 shapeless
提供的标记类型或创建一个扩展 AnyVal
的类。使用其中一种与另一种相比有什么区别和优点/缺点?
示例:
trait CountryCodeTag
type CountryCode = String @@ CountryCodeTag
class CountryCode(code: String) extends AnyVal
最佳答案
类型 CountryCode = String @@ CountryCodeTag
+ String @@ CountryCodeTag
是 String
的子类型,即 String
中的所有方法都可以直接使用:countryCode。改为大写
。
− String @@ CountryCodeTag
可能会在需要某些 String
的地方意外使用,即它的类型安全性较低。
− 创建新值有点尴尬:"a".asInstanceOf[String @@ CountryCodeTag]
或 val tagger = new Tagger[CountryCodeTag];标记器(“a”)
。
− 对 Shapeless 的依赖(尽管这可以手动完成)。
class CountryCode(code: String) extends AnyVal
+ 类型更加安全。
- 通过一些额外的努力即可使用来自String
的方法:
class CountryCode(val code: String) extends AnyVal
new CountryCode(countryCode.code.toUpperCase)
或
class CountryCode(val code: String) extends AnyVal
object CountryCode {
def unapply(...) = ...
}
countryCode match { case CountryCode(code) => new CountryCode(code.toUpperCase) }
或
case class CountryCode(code: String) extends AnyVal
countryCode.copy(code = countryCode.code.toUpperCase)
+ 创建新值更自然一些:new CountryCode("a")
。
+ 没有额外的依赖项(它是纯 Scala)。
关于scala - 标记类型与类扩展 AnyVal,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46748075/
假设我有一个值(value)案例类 case class Id(i:Int) extends AnyVal 以及包含此值案例类的序列 Seq(Id(1), Id(2), Id(3)) 有没有办法将这些
据我了解,Scala 中的值类只是将原始类型(如 Int 或 Boolean)包装成另一种类型,而不会引入额外的内存使用。所以它们基本上被用作普通类的轻量级替代品。 这让我想起了 Haskell 的
我正在寻找一个接受函数的方法的正确签名 功能 和一个论点 arg ,通过网络将它们复制到远程计算机并返回结果。目前签名是这样的: def invokeRemote[A,B](address: Stri
我想不出任何情况下类型 AnyVal会很有用,尤其是添加了 Numeric用于抽象的类型 Int , Long等。AnyVal 是否有任何实际用例? ,或者它只是一个使类型层次结构更漂亮的工件? 澄清
为了引入更多类型安全性,我们可以使用 shapeless 提供的标记类型或创建一个扩展 AnyVal 的类。使用其中一种与另一种相比有什么区别和优点/缺点? 示例: trait CountryCode
我不小心写了这行代码: scala> val f = Int f: Int.type = object scala.Int 似乎适用于 AnyVal 的每个子类型除了 AnyVal本身。 有什么我可以
试过这个: scala> 2.isInstanceOf[AnyVal] :8: error: type AnyVal cannot be used in a type pattern or isIns
假设我有一个自定义类,它扩展了 AnyVal 并在内部使用了一个 Long: case class Instruction(underlying: Long) extends AnyVal 当我将 I
假设我正在编写一个扩展方法 implicit class EnhancedFoo(foo: Foo) { def bar() { /* ... */ } } 您是否应该始终在类定义中包含exten
我一直在用scala编写代码来查找最短路径。这是我寻找最短路径的代码。但我在以下代码部分遇到错误 if ( (kv1._1 + kv1._2 ) val a = line.split(",")
这是我的代码。我在第二个 case 子句中遇到编译错误: Error:(92, 26) value "price under 2" def tupleMatch: Unit = { val do
为什么Scala Some不继承AnyVal,使用值类型特性,节省装箱成本? 就像是: sealed trait TestOption[+A] extends Any { def isEmpty:
在 Java 中,当我们在方法中创建原语时,它们存储在堆栈内存中,而实例化的对象(如使用 new)则放在堆中。在 scala 中,AnyVal 的子类型(如 Int)是无法实例化的不可变值实例。因此,
任何人都可以解释为什么下面的 Scala 代码片段: def convertRefToVal(obj: Any): Int = { if (obj.isInstanceOf[java.lang.I
是斯卡拉 AnyVal及其子类 [可以] 堆栈分配 [如 C# 结构或 Java 原语]?我们可以像 Scala 上的 C# 结构一样创建一个自定义的堆栈分配变量吗? 最佳答案 斯卡拉: class
因此,在 Java 中,我们看到基本类型比对象类型占用更少的内存空间。例如,int 比 Integer 实例占用的空间更少。因此,使用 char 而不是 String 来存储单个字符通常更明智。 我想
我想知道,为什么 AnyVal 不能在 isInstanceOf 检查中使用?这种行为背后的原因是什么? scala> val c = 't' c: Char = t scala> c.isInsta
我想派生值类的编码器实例。使用 semiauto 机制,我无法派生嵌套类。 想象一下下面的案例类结构 { case class Recipient(email: Recipient.Email,
我有一个这样定义的映射器函数: def foo(x:Int) = if (x>2) x*2 此方法的类型签名是 Int => AnyVal。现在,如果我将此函数映射到整数列表: scala> List
尝试在 Scala 中使用 json4s 序列化 AnyVal 序列时遇到问题。 这是使用 FunSuite 进行的测试,可重现该问题: import org.json4s._ import
我是一名优秀的程序员,十分优秀!