我正在Linux上尝试一个简单的命令行应用程序,我有以下代码。
代码
import Glibc
import Foundation
infix operator |>> { associativity left }
func |>> <A, B, C>(f: A -> B, g: B -> C) -> A -> C {
return { x in g(f(x)) }
}
func readln(max:Int = 8192) -> String? {
assert(max > 0, "max must be between 1 and Int.max")
var buf:Array<CChar> = []
var c = getchar()
while c != EOF && c != 10 && buf.count < max {
buf.append(CChar(c))
c = getchar()
}
buf.append(CChar(0))
return buf.withUnsafeBufferPointer { String.fromCString($0.baseAddress) }
}
func myPrint(str: String?) {
guard let unwrapped = str else {
return;
}
print("\(unwrapped)")
}
//This compiles & runs
var input = readln()
myPrint(input)
//this does not!
let main = readln |>> myPrint
main()
编译器输出
/home/**********/SwiftProjects/HelloPackage/Sources/main.swift:37:5: error: missing argument for parameter #1 in call
main()
^
<unknown>:0: error: build had 1 command failures
error: exit(1): ["/home/**********/Swift/usr/bin/swift-build-tool", "-f", "/home/**********/SwiftProjects/HelloPackage/.build/debug/HelloPackage.o/llbuild.yaml"]
当我使用自定义函数组合运算符时,它不允许我使用与单独调用函数时相同的默认参数值。
有人可以解释发生了什么吗?
答案 0 :(得分:1)
与功能相比,闭包不允许具有默认参数值。所以上面没有具体的与你的自定义运算符有关(除了它返回一个闭包的事实)。
Closure表达式语法可以使用常量参数,变量 参数和inout参数。 无法提供默认值。
另外,关于运行什么和不运行的比较:请注意以下是两行完全不同的代码:
var input = readln() // 'input' is a value: String?
// ...
let main = readln |>> myPrint // 'main' is a closure: (Int) -> ()
main() // expected error
/* since main is a closure, you've "lost" the default
value that is present in the _function_ readln */