当我正在开发一个将于2014年左右公开发布的C++库时,我目前正在做出设计选择.使用C++ 14发布的非常有用的工具之一是std::optional.我想知道g++/libstdc++我期望使用哪个版本的版本-std=c++1y.
我想知道如何实现Swift(Int,Float ...)中的值类型来支持可选绑定("?").我假设这些值类型没有在堆上分配,而是在堆栈上分配.那么,它们是否依赖某种指向可能为null的堆栈的指针,或者底层struct是否包含布尔标志?
是否可以Optional inout在Swift中为函数提供参数?我想这样做:
func testFunc( inout optionalParam: MyClass? ) {
if optionalParam {
...
}
}
Run Code Online (Sandbox Code Playgroud)
...但是当我尝试调用它并通过时nil,它给了我一个奇怪的编译错误:
Type 'inout MyClass?' does not conform to protocol 'NilLiteralConvertible'
Run Code Online (Sandbox Code Playgroud)
我不明白为什么我的类在已经被声明为可选时必须符合某些特殊协议.
我在Obj-C中做了很多NSCoding归档,但我不确定它如何处理Swift中的结构,也不确定具有可选值的数组.这是我的代码:
public struct SquareCoords {
var x: Int, y: Int
}
Run Code Online (Sandbox Code Playgroud)
这是我需要存储的类:
public class Player: NSCoding {
var playerNum: Int
var name = ""
private var moveHistory: [SquareCoords?] = []
init (playerNum: Int, name: String) {
self.playerNum = playerNum
self.name = name
}
public required init(coder aDecoder: NSCoder!) {
playerNum = aDecoder.decodeIntegerForKey("playerNumKey")
name = aDecoder.decodeObjectForKey("nameKey") as String
moveHistory = aDecoder.decodeObjectForKey("moveHistoryKey") as [SquareCoords?]
}
public func encodeWithCoder(aCoder: NSCoder!) {
aCoder.encodeInteger(playerNum, forKey: "playerNumKey")
aCoder.encodeObject(name, forKey: "nameKey")
aCoder.encodeObject(moveHistory, forKey: "moveHistoryKey")
}
...
Run Code Online (Sandbox Code Playgroud)
在编码器init的最后一行,我在XCode中收到以下错误消息: …
是不是因为Java 1.8返回Optional对象比抛出异常更可取?我越来越多地看到这样的代码:
public Optional<?> get(int i) {
// do somtething
Object result = ...
Optional.ofNullable(result);
}
Run Code Online (Sandbox Code Playgroud)
而不是这个:
public Object get(int i) {
if(i<0 || i>=size) {
throw new IndexOutOfBoundsException("Index: " + i + ". Size: " + size);
}
// do somtething
Object result = ...
return result;
}
Run Code Online (Sandbox Code Playgroud)
是否意味着我们需要忘记旧方法并使用新方法?什么地方Optional适合?
我需要测试一个返回一个可选项的表达式nil.这看起来很简单,但这里是代码.
if nil != self?.checklists.itemPassingTest({ $0 === note.object }) {
…
}
Run Code Online (Sandbox Code Playgroud)
由于某种原因,我的眼睛看起来很不愉快.
if let item = self?.checklists.itemPassingTest({ $0 === note.object }) {
…
}
Run Code Online (Sandbox Code Playgroud)
看起来好多了,但我实际上并不需要这个项目,我只需要知道是否有人退回.所以,我使用了以下内容.
if let _ = self?.checklists.itemPassingTest({ $0 === note.object }) {
…
}
Run Code Online (Sandbox Code Playgroud)
我错过了一些微妙的东西吗?我认为if nil != optional …并且if let _ = optional …相当于此.
更新以解决答案中的一些问题
我不明白之间的差别nil != var和var != nil,虽然我一般使用var != nil.在这种情况下,按下!= nil块之后获取混合的块的布尔比较和if的布尔比较.
使用通配符模式不应该是令人惊讶或不常见的.它们用于元组(x, _) = (10, 20),for-in循环 …
假设我有一个给定名称,姓氏对的地图,我想找到该地图中第一个条目的名称,该名称的姓氏与某个值相匹配.我们如何以java 8的方式做到这一点.
在我下面的测试用例中,我提出了两种方法.
然而,第一个(寻找姓氏为"Donkey"的第一个人的名字)将抛出java.util.NoSuchElementException:没有值存在,因此它不安全.
第二个工作,但它不仅难以阅读,但它有点不太实用.
只是不知道是否有人在这里会建议我实现这个要么使用一个更简单更清晰的方式stream()或forEach()或两者兼而有之.
@Test
public void shouldBeAbleToReturnTheKeyOfTheFirstMatchingValue() throws Exception {
Map<String, String> names = new LinkedHashMap<>();
names.put("John", "Doe");
names.put("Fred", "Flintstone");
names.put("Jane", "Doe");
String keyOfTheFirst = names.entrySet().stream().filter(e -> e.getValue().equals("Doe")).findFirst().get().getKey();
assertEquals("John", keyOfTheFirst);
try {
names.entrySet().stream().filter(e -> e.getValue().equals("Donkey")).findFirst().get();
} catch (NoSuchElementException e){
// Expected
}
Optional<Map.Entry<String, String>> optionalEntry = names.entrySet().stream().filter(e -> e.getValue().equals("Donkey")).findFirst();
keyOfTheFirst = optionalEntry.isPresent() ? optionalEntry.get().getKey() : null;
assertNull(keyOfTheFirst);
}
Run Code Online (Sandbox Code Playgroud)
先感谢您.
如何在不使用任何if语句的情况下从Guava Optional转换为Java Optional?
if (maybeSomething.isPresent()) {
return java.util.Optional.of(maybeSomething.get())
} else {
return java.util.Optional.empty()
}
Run Code Online (Sandbox Code Playgroud) 我喜欢自选是在Java标准库现在.但是我仍然遇到一个基本问题,我还没有弄清楚如何以最好的方式解决(最容易阅读和理解,最漂亮,最短)的方式:
当可选项为空时如何从方法返回?
我正在寻找一个通用的解决方案,适用于选项数和代码块大小的不同组合.
在下面的例子中,我将尝试展示我的意思:
void m1() {
// When I get an optional:
Optional<String> o = getOptional();
// And want to return if it's empty
if (!o.isPresent()) return;
// In the whole rest of the method I have to call Optional.get
// every time I want the value:
System.out.println(o.get());
// Which is pretty ugly and verbose!
}
void m2() {
// If I instead return null if a value is absent:
String s = getNullabe();
if (s == …Run Code Online (Sandbox Code Playgroud) 我在javascript中一直在做很多像这样的代码
if (params && params.profile && params.profile.address && params.profile.address.default)
我必须检查每个可选项,它变得相当繁琐.在javascript中有更好的方式,类似于swift如何处理选项,例如
if let checked = params?.profile?.address?.default?