我理解Ruby和Python的收益率.Scala的收益率是多少?
当程序员抱怨空错误/异常时,有人经常会问我们做什么而没有null.
我对选项类型的酷感有一些基本的想法,但我没有最好的表达它的知识或语言技巧.对于普通程序员可以接近的方式写的以下内容有什么好的解释,我们可以指出那个人?
null programming-languages functional-programming nullpointerexception non-nullable
为什么Clojure尽管如此强调功能范式,却不使用Maybe/ Optionmonad来表示可选值?Option在Scala中使用非常普遍,Scala是我经常使用的函数式编程语言.
我的代码变得乱七八糟,使用以下代码模式:
val opt = somethingReturningAnOpt
if (opt.isDefinedAt) {
val actualThingIWant = opt.get
}
Run Code Online (Sandbox Code Playgroud)
有没有办法简化这个?(似乎不必要的复杂和代码味道).理想情况下它会是这样的:
if (Some(actualThingIWant) = somethingReturningAnOpt) {
doSomethingWith(actualThingIWant)
}
Run Code Online (Sandbox Code Playgroud)
有可能吗?
我学习Scala已有一段时间了,无法清楚地了解Option的用法.当我链接函数时,它可以帮助我避免空值检查(根据文档).这对我来说很清楚:)
接下来我看到Option可以作为开发人员的一种指示器,这里可以使用null值,并且必须对其进行处理.这是真的吗?如果是,我应该使用选项吗?例如
class Racer {
val car = new Car()
}
Run Code Online (Sandbox Code Playgroud)
我有Racer类,我确定car field不能为null(因为它是常量并在创建Racer实例时得到一个值).这里不需要选项.
class Racer {
var car = new Car()
}
Run Code Online (Sandbox Code Playgroud)
在这里,我这样做,以便汽车可以改变.并且有人可以为汽车分配零.我应该在这里使用Option吗?如果是,我注意到我所有的班级字段都是Option的候选者.我的代码看起来像这样
class Racer {
var car: Option[Car] = None
var currentRace: Option[Race] = None
var team: Option[Team] = None
...
}
Run Code Online (Sandbox Code Playgroud)
它看起来不错吗?对我来说,似乎有点过度使用.
def foo(): Result = {
if( something )
new Result()
else
null
}
Run Code Online (Sandbox Code Playgroud)
我有一个可以返回null的方法.我应该返回Option吗?如果方法可以返回null,我是否应该总是这样做?
任何有关它的想法都会有所帮助.提前致谢!
我的问题类似于为什么选项,但我认为它不一样.它更多的是关于何时,而不是为什么.:)
在这个应用程序中,我收到此错误:
scala.Some cannot be cast to java.lang.String
Run Code Online (Sandbox Code Playgroud)
在尝试这个时:
x.email.asInstanceOf[String]
Run Code Online (Sandbox Code Playgroud)
x.email是一个选项[String]
编辑:我知道我在这里处理不同的类型,我只是想知道是否有一个更简洁的方法什么都不做,然后一个
match { case....}
Run Code Online (Sandbox Code Playgroud)
序列.因为我将x.email转换为String以用于JSON目的,所以JSON对象将处理空字段,并且我没有明确地处理它.很抱歉不清楚!!
简介:我从成员事务表中提取用户ID列表,然后用于从数据库生成用户列表.然后,这将用于生成发送到列出与帐户关联的用户的页面的JSON.
背景:在游戏中使用Squeryl的Scala代码!骨架
错误: value id is not a member of Option[models.User]将用户映射到JSON生成器时
代码:这里的代码连续用于最终生成JSON
def memberIds(accountId: Long) = { from(DB.members)(m =>
where(m.accountId === accountId)
select (m)).map(_.userId).toSet
}
def membersToAccount(id: Long) = {
memberIds(id).map( i => models.User.get(i))
}
def listMembers(accountId: Long) = {
Json(generate(Account.membersToAccount(accountId)
.map(user => Map(
"id" -> user.id,
"name" -> user.name,
"username" -> user.username
))))
}
Run Code Online (Sandbox Code Playgroud)
困惑: User类包含一个id值,看起来case class User(
val id: Long, etc.我很困惑为什么会产生这个错误.是语法问题还是我映射用户的问题?谢谢!
可能重复:
为什么选项[T]?
引用类型提供特殊值,null表示"缺少值".值类型没有这样的值,这就是C#引入可选值类型(以及它们的特殊语法)的原因.
Scala的Option[T]有三种不同的"空"值:null,None和Some(null).在安全性和可表达性方面,这增加了多少复杂性给我们带来了什么?我什么时候使用哪个?
可能重复:
为什么选项[T]?
我是Scala的新手,我无法真正感受到java和OptionScala上的null之间的区别.我知道没有一个是对象,如果我在Scala上写这样的smth,它会安全的:
val map = Map("koko" -> "is a cat")
val string:Option[String] =map.get("other")
println(string.map(a=>println(a.toString)) )
Run Code Online (Sandbox Code Playgroud)
我得到None的结果不是抛出异常.这真有趣 .
但是,如果我需要返回值不被包装Some.我将使用.get来返回值.
在我们的例子中,它将抛出异常:
map.get("other").get.map(a=>println(a.toString))
Run Code Online (Sandbox Code Playgroud)
我知道我可以通过使用"匹配"来处理这个问题.我正在这里,我需要了解Scala上的选项对于java上的null有什么兴趣!
我仍然无法得到的是我如何使用Option的优点但是如果我的变量中存在值,则返回值不 Some(value)
def testOption(): String = {
val map = Map("koko" -> "is a cat")
val string: Option[String] = map.get("koko")
string
}
Run Code Online (Sandbox Code Playgroud)
我的意思是有任何方法使这段代码工作,而不是更新返回值Option[String]!想象一下,我必须返回一个String才能被设置为我的bean变量,而不是String类型Option[String]
我怎么能没有任何形式的作品match!我想如果有它可以使它有效,那将使我更好地理解它的力量Option.