- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我知道有多个问题可以解决相关问题,但我不确定它是否会攻击我正在寻找的内容。经过几年的 Java 开发,我对 Scala 还是很陌生。我正在寻找测试对象是否已初始化的最佳方法,如果没有,则对其进行初始化。例如,在 Java 中:
private MyObject myObj = null;
在未来的某个时间点:
public void initMyObj(){
if (myObj == null){
myObj = new MyObj();
}
// do something with myObj
}
在此之后,我可能会将 myObj 重新分配给不同的对象,但这不太可能。在 Scala 中,我有这个:
class Test {
var myObj: MyObj = _
}
我读到我可以使用 Option 代替,例如:
var myObj = None : Option[MyObj]
然后是我的支票:
myObj match {
case None => ...
case Some(value) => ...
}
但是当我可能不会在其他任何地方进行这种检查时,使用这种模式感觉很尴尬——尽管我对 Scala 如此陌生,但我可能错了。这是实现我想要的最佳方式还是有任何其他选项不涉及 Option?
最佳答案
在 Scala 中,将部分构造的对象留在周围通常不是理想的做法。你通常会重新考虑你的对象是如何被实例化的,看看你是否不能使用不那么脆弱的不同模式。例如,不要在方法中设置未初始化的变量:
class Foo { var a: String = null; var b: String = null }
def initFooA(s: String, f: Foo) { if (f.a == null) f.a = s }
def initFooB(s: String, f: Foo) { if (f.b == null) f.b = s }
f
initFooA("salmon", f)
// Do stuff
initFooB("herring", f)
您将尝试重新构建代码以按需生成所需的值,然后将 foo 的实例化延迟到那时:
case class Bar(a: String, b: String) {}
def initBarA(s: String) = s
def initBarB(s: String) = s
val iba = initBarA("halibut")
// Do stuff
val ibb = initBarB("cod")
Bar(iba, ibb)
因为 Scala 可以轻松访问元组(和类型推断),所以这比在 Java 中要容易得多。
您可以做的另一件事是将后期初始化推迟到其他人。
case class Baz(a: String)(bMaker: => String) {
lazy val b = bMaker
}
现在你传入一些将成为参数 b 的东西,并安排它处理任何需要处理的后期初始化内容。这并不总是避免需要设置 var,但它可以帮助将其从您的类代码中推出到您的初始化逻辑中(这通常是一个更好的地方)。
使用 vars 执行此操作有点不那么简单。实际上,您最好只为它上一个类,例如作者:
class LazyVar[A](initial: => A) {
private[this] var loaded = false
private[this] var variable: A = _
def apply() = { if (!loaded) { loaded = true; variable = initial }; variable }
def update(a: A) { loaded = true; variable = a }
}
然后(遗憾地)您必须在每次读写时使用 ()
。
scala> val lv = new LazyVar({ println("Hi!"); 5 })
lv: LazyVar[Int] = LazyVar@2626ea08
scala> lv()
Hi!
res2: Int = 5
scala> lv() = 7
scala> lv()
res4: Int = 7
然后你使用这个类的一个实例而不是实际的 var
并通过惰性初始化器。 (lazy val
在底层非常类似;编译器只是保护你不被注意到。)
最后,如果你想要一个功能齐全但偶尔会丢失值的对象,var x: Option[X]
就是你想要使用的构造;如果您无法找到绕过标准 Java 创建模式的方法(并且您不想尝试一些更奇特的东西,例如使用越来越多的信息相互创建的对象,或者因为性能至关重要而您负担不起,或者您不喜欢编写那么多样板来允许类型检查以验证您的对象是否正确创建)但您想使用它,var x: X = null
是我会选择的,不是 _
。如果 X
是一个原语,您可能无论如何都需要明智地选择正确的值(例如,Double.NaN
而不是 0.0
,-1
而不是 0
for Int
) 表示我未初始化。如果它是通用代码并且你想要 Any
而不是 AnyRef
,asInstanceOf
- 在 Any
和 AnyRef
可能是摆脱类型检查不佳情况的最佳方法(假设你真的,真的不能使用 Option
,这在这一点上要清楚得多)。
关于Scala - 处理对象的初始化(_ vs Option[T]),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14402467/
我经常使用 var options = options || {} 作为默认为空对象的方式。它通常用于初始化选项对象,以防它未在函数调用的参数中传递。 问题是我在几个地方(博客文章、源代码)读到opt
我是Python中Rust的新手。这是我学习Rust的第四天。 在第一个问题Type casting for Option type之后,我有一个跟语法match和所有权概念有关的后续问题。 首先,我
我正在学习 Ray Wenderlich。我遇到了闭包语法错误。我想知道 Xcode 提示是什么意思? Xcode 报告如下: /Users/.../FlickrPhotosViewControlle
使用 Python 编写命令行界面 (CLI) 时 click library , 是否可以定义例如三个选项,其中仅当第一个(可选)未设置时才需要第二个和第三个选项? 我的用例是一个登录系统,它允许我
我有一个这样的 JPA 查询。 PersonRepository.java public Optional> findByStatus(int status); 人员服务.java System.ou
我遇到了很多地方,我有类似的东西 def f(s: String): Option[Long] = ... def g(l: Long): IO[Option[Wibble]] = ... val a
我有一个results: List[Future[Option[T]]]其中包含(并行)计算。 我想获得第一个非None尽快出结果,或者返回None如果所有计算都返回 None . 目前,我正在这样做
我正在尝试加载一个简单的 Listbox组件来自 @headlessui/react . 选择.tsx type Option = { id: number name: string
如何将Future[Option[Future[Option[X]]]]转换为Future[Option[X]]? 如果它是 TraversableOnce 而不是 Option 我会使用 Futur
Haskell、Rust 等语言提供了一个 Maybe 或 Option 类型。即使在 Java 中,也有一个 Optional 现在打字。 为简单起见,我将在剩下的问题中将此类型称为“选项类型”。
当我尝试在 SQL 中存储一个 XML 而不是一个空元素时,SQL 只是更改它并仅使用一个元素标签来存储它。例如,要存储的 XML 是: ROGER 然后Sql存起来就好了
使用这个非常好的命令行解析器 Argo(仅 header C++ 库)我遇到了一个小问题。请参阅:https://github.com/phforest/Argo Argo 返回:'Error: Un
我是来自 Java 背景的 Scala 新手,目前对考虑 Option[T] 的最佳实践感到困惑. 我觉得用 Option.map只是更实用和美观,但这不是说服其他人的好理由。有时, isEmpty
这个问题在这里已经有了答案: Chaining Optionals in Java 8 (9 个回答) Optional orElse Optional in Java (6 个回答) Functio
Optional::stream如果存在,则返回一个包含该值的 Stream,否则返回一个空流。所以对于 Stream> optionals , optionals.flatMap(Optional:
我使用箭头键作为输入,在 printf 菜单中上下移动 printf 箭头(“==>”)。 我正在使用一个函数来计算箭头应该在的位置,并使用 switch case 和 printf("\n==>")
这个问题在这里已经有了答案: What does the construct x = x || y mean? (12 个答案) 关闭 9 年前。 如我的问题标题所述,我最近偶然发现了这个变量声明:
这个问题在这里已经有了答案: BackboneJS: What is options || (options = {}); in Backbone source code (1 个回答) 关闭 8
我有这个简单的语法: word = Word(alphanums + '_') with_stmt = Suppress('with') + OneOrMore(Group(word('key') +
使用 Cucumber 和 SitePrism 编写测试,我在页面上有以下 HTML... Select a Status Active Product Inactive Prod
我是一名优秀的程序员,十分优秀!