我最初对强行展开和隐式展开非常困惑.现在,以下理解来自我的自学:
有没有可用的隐含解包的动作,但有一些所谓的隐式解开选配.隐式解包的Optionals和普通的Optionals都是Optionals,区别在于访问一个隐式解包的Optional时,你自信地知道底层有一个有效的值并且可以使用.Normal Optionals需要if let绑定或强制unwrapping(!)动作来访问可选变量后面的可能值.
摘要:
强迫去包裹是一个行动的正常选配完成.
隐式解包的Optionals是 Optionals,通常用于类初始化,并在使用时传递没有感叹号的值.
问题:
我对吗?如果我的理解不准确,如果你纠正我,我将不胜感激.
谢谢
我有一个接口与以下方法
public interface IRemoteStore {
<T> Optional<T> get(String cacheName, String key, String ... rest);
}
Run Code Online (Sandbox Code Playgroud)
实现接口的类的实例称为remoteStore.
当我用mockito模拟它并在以下时使用该方法:
Mockito.when(remoteStore.get("a", "b")).thenReturn("lol");
Run Code Online (Sandbox Code Playgroud)
我收到错误:
无法解析方法'thenReturn(java.lang.String)'
我认为这与get返回Optional类的实例这一事实有关,所以我尝试了这个:
Mockito.<Optional<String>>when(remoteStore.get("cache-name", "cache-key")).thenReturn
(Optional.of("lol"));
Run Code Online (Sandbox Code Playgroud)
但是,我得到了这个错误:
当Mockito中的(可选'<'String'>')无法应用于(可选'<'对象'>')时.
它唯一有效的时间是:
String returnCacheValueString = "lol";
Optional<Object> returnCacheValue = Optional.of((Object) returnCacheValueString);
Mockito.<Optional<Object>>when(remotestore.get("cache-name", "cache-key")).thenReturn(returnCacheValue);
Run Code Online (Sandbox Code Playgroud)
但上面返回一个Optional'<'Object'>'的实例,而不是Optional'<'String'>.
为什么我不能直接返回Optional'<'String'>'的实例?如果可以,我该怎么做呢?
显然,std::optional如果使用C++ 17或boost,则从函数返回可选值是最佳选择(另请参阅GOTW#90)
std::optional<double> possiblyFailingCalculation()
Run Code Online (Sandbox Code Playgroud)
但是,如果一个人坚持使用旧版本(并且不能使用提升),那么什么以及为什么会是最好的选择呢?
我看到几个选项:
STL智能指针(仅限C++ 11)
std::unique_ptr<double> possiblyFailingCalculation();
Run Code Online (Sandbox Code Playgroud)
将它与bool配对
std::pair<double,bool> possiblyFailingCalculation();
Run Code Online (Sandbox Code Playgroud)老式
bool possiblyFailingCalculation(double& output);
Run Code Online (Sandbox Code Playgroud)
auto value = calculation() 样式不兼容 一个DIY模板:一个具有相同功能的基本模板很容易编码,但是实现一个健壮的std::optional<T>外观模板是否有任何陷阱?
抛出一个例外
这是Swift中的有效代码:
println(nil < 1)
Run Code Online (Sandbox Code Playgroud)
同样,输出也是如此
println(nil > 1)
Run Code Online (Sandbox Code Playgroud)
将为false(数字1是任意的,您可以对-1执行相同操作,可能还有其他内容).我问的原因是因为我看到一些代码试图与"some_string".toInt()数值进行比较并编译,考虑到toInt()返回似乎是错误的Int?.
我的问题是,这应该是Swift中的有效语法吗?如果是这样,nil的数值是多少?
Swift 3.0更新:
看起来Swift Evolution通过删除可选的比较运算符解决了这个问题.这不再是Swift 3.0中的一个问题,因为它不能编译.
感谢这里的一些优秀答案,我通常理解(显然是以有限的方式)Haskell的目的,Maybe并且它的定义是
data Maybe a = Nothing | Just a
Run Code Online (Sandbox Code Playgroud)
但是,我并不清楚实体为什么Just是这个定义的一部分.尽管我已经知道了,但这是它Just自己定义的地方,但相关文档并没有多说.
我是否正确认为Just在定义中使用的主要好处Maybe,而不是简单
data Maybe a = Nothing | a
Run Code Online (Sandbox Code Playgroud)
它是否允许模式匹配Just _和有用的功能,如isJust和fromJust?
为什么Maybe以前一种方式而不是后一种方式定义?
我想定义一个带有一个参数的闭包(我将其引用it)有时我想将另一个参数传递给闭包.我怎样才能做到这一点?
最后,本文介绍了新的Java 8 Optional,并指出
可选项并不像Scala中的Option [T]那么强大(但至少它不允许包装null).API不像null处理那么简单,可能要慢得多.但编译时检查的好处加上可选性的可读性和文档值始终大大优于劣势
我对Scala有一个非常基本的了解,并且我熟悉Java 8 Optional,所以初看起来,我不清楚两者之间有什么区别,如果有的话.
我知道,例如,在Scala中我可以使用模式匹配来测试Option并让我的生活更轻松.但是,排除Scala语法的特性,我想知道Option在Scala中是否可以用OptionalJava 做些什么.
希望这不是一个愚蠢的问题,但每当我读到"强大的"时,问号就会浮现在我的头上.
为什么std::optional(目前std::experimental::optional在libc ++中)没有引用类型的专门化(与之相比boost::optional)?
我认为这将是非常有用的选择.
是否有一些对象引用了STL中可能已存在的对象语义?
我对flatMap有点困惑(添加到Swift 1.2)
假设我有一些可选类型的数组,例如
let possibles:[Int?] = [nil, 1, 2, 3, nil, nil, 4, 5]
Run Code Online (Sandbox Code Playgroud)
在Swift 1.1中,我会做一个过滤器,然后是这样的地图:
let filtermap = possibles.filter({ return $0 != nil }).map({ return $0! })
// filtermap = [1, 2, 3, 4, 5]
Run Code Online (Sandbox Code Playgroud)
我一直尝试使用flatMap这样做:
var flatmap1 = possibles.flatMap({
return $0 == nil ? [] : [$0!]
})
Run Code Online (Sandbox Code Playgroud)
和
var flatmap2:[Int] = possibles.flatMap({
if let exercise = $0 { return [exercise] }
return []
})
Run Code Online (Sandbox Code Playgroud)
我更喜欢最后一种方法(因为我不必强制解包$0!...我害怕这些并且不惜一切代价避免它们)除了我需要指定数组类型.
是否有一个替代方法可以根据上下文计算出类型,但是没有强制解包?
functional-programming optional higher-order-functions flatmap swift
我想使用流畅的api Optional并应用两个Consumers.
我在梦想这样的事情:
Optional.ofNullable(key)
.map(Person::get)
.ifPresent(this::printName)
.ifPresent(this::printAddress); // not compiling, because ifPresent is void
Run Code Online (Sandbox Code Playgroud)
我该如何申请几个Consumers到的Optional?