我要去假设p
是RSVPData
项目。正确? (
当你在一个Option
使用.getOrElse
,你正试图提供在没有定义值(即,当值None
)。换句话说时的默认值,getOrElse
给你一个机会提供默认的详细地点时没有可用的,这样就可以以一致的方式处理这两种情况。在你的情况,这种说法应该是VenueDetails
一个实例。
通过传递None
作为参数getOrElse
你说如果Option
的值为None
,那么你想要None
--这意义不大,更糟糕的是,getOrElse
现在返回两种类型的值:a VenueDetails
或None
。因此,斯卡拉确定返回类型为这两种类型共有的特征,它们确定为Product with Serializable
。因此,您不能将返回值视为VenueDetails
,因此您无法访问其成员。
一般拇指的规则:从来没有过None
到Option.getOrElse
! ;-)
(顺便说一句,在调用中指定的参数名是不必要的。p.venue.getOrElse(None)
是简单等同于p.venue.getOrElse(default = None)
)
所以,现在它取决于你想要做什么,这不清楚你的问题。我会尝试提供几个例子...
这第一个例子比功能性更重要。它试图打印出场所的细节:
// Is the venue defined? (If None, then it's undefined.)
if (p.venue.isDefined) {
// Retrieve the defined details. Note that get throws an exception if p.venue is None.
// BTW, detail's type is inferred to be VenueDetails.
val details = p.venue.get
println(s"Venue: ${details.venue_name}, loc: (${details.lon}, ${details.lat}), id: ${details.venue_id}")
}
// Handle the case where the venue details are undefined.
else {
println("Venue details are unknown")
}
这里有一个稍微功能版本:
val desc = p.venue.fold {
// This argument is evaluated only if p.venue is None.
"Venue details are unknown"
} {
// This argument is executed only if p.venue is defined (not None).
// Again, details is inferred to have type VenueDetails
details =>
s"Venue: ${details.venue_name}, loc: (${details.lon}, ${details.lat}), id: ${details.venue_id}"
}
println(desc)
这个版本使用了其中的详细地点是未知的情况下,默认VenueDetails实例:
// Default details for case where p.venue is None.
val defaultDetails = VenueDetails("Unknown", 0.0, 0.0, -1)
// Here, details will have type VenueDetails.
val details = p.venue.getOrElse(defaultDetails)
val desc = s"Venue: ${details.venue_name}, loc: (${details.lon}, ${details.lat}), id: ${details.venue_id}"
println(desc)
在后一种情况下,如果p.venue为None,那么以下内容将为印刷:
Venue: Unknown, loc: (0.0, 0.0), id: -1
然而,如果p.venue被定义为每您的例子,则以下将被打印:
Venue: Waller Creek Pub House, loc: (-97.73584, 30.266438), id: 24179503