该函数makeEvenGenerator应该返回一个以顺序方式生成偶数的函数:
package main
import "fmt"
func makeEvenGenerator() func() uint {
i := uint(0)
return func() (ret uint) {
ret = i
i += 2
return
}
}func main() {
nextEven := makeEvenGenerator()
fmt.Println(nextEven()) // 0
fmt.Println(nextEven()) // 2
fmt.Println(nextEven()) // 4
}
Run Code Online (Sandbox Code Playgroud)
当我运行它,我得到的错误syntax error: unexpected func, expecting semicolon or newline和Non-declaration statement outside function body.
该代码是从Caleb Doxsey的Go编程简介中逐字记录的.我不确定问题是什么.
是否可以将闭包作为函数中的可选参数?
我需要这样的东西(伪代码):
fn function(x: int, optional expr |int| -> int) -> int
Run Code Online (Sandbox Code Playgroud)
和用法将是这样的:
// just the mandatory argument
n = function(z);
Run Code Online (Sandbox Code Playgroud)
或者可选:
// passed closure would be called inside the function
n = function(z, |x| x * x);
Run Code Online (Sandbox Code Playgroud)
如果它甚至可能,我只是无法掌握正确的语法(会欣赏正确匹配表达式的完整示例).
这是对你在john resig的Learning Advanced Javascript应用程序中找到的内容的改编.
var math = {
fact: function fact(n){
return n > 0 ? n * fact(n-1): 1;
},
fact1: function (n) {
return n > 0? n * math.fact1(n-1) : 1;
}
};
console.log(math.fact(5)); // 120
console.log(math.fact1(5)); // 120
var o = {
x: math.fact,
y: math.fact1
};
math = {};
console.log(o.x === undefined); // false
console.log(o.y === undefined); // false
console.log(o.x(5)); // 120
console.log(o.y(5)); // Uncaught TypeError: math.fact1 is not a function
Run Code Online (Sandbox Code Playgroud)
人们会期望o.x(5)应该抛出错误,但它会执行.为什么?
我来自.NET世界,所以我对Swift中如何实现泛型有点困惑.我正在尝试执行以下操作:
func request<T: Model>(resultHandler: (model: T?) -> ()) {
var model: T? = nil
NSURLSession.sharedSession().dataTaskWithURL(NSURL(string: self.url)!) {
data, response, error in
if let json = NSString(data: data, encoding: NSUTF8StringEncoding) {
model = T(json: json)
resultHandler(model: model)
}
}.resume()
}
Run Code Online (Sandbox Code Playgroud)
并按如下方式使用它:
var store: HttpStore = HttpStore(url: ...)
store.request {
model in
println("Task name: \(model.name!)")
}
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
'T?' 没有名为'name'的成员
我明白了.我没有在我的调用代码中的任何地方解析T到特定类型.在.NET中我会做类似store.request <Task>()...但我不能在Swift中这样做.
有没有办法完成我在这里要做的事情?
我注意到Java的Lambda表达式似乎等同于Objective-C块.
Java的Lambda表达式是否完全等同于Objective-C的块?如果没有,那么什么使Objective-C块不同?
我在从闭包中检索数据时遇到问题.我正在调用函数getWallImages,它应该返回一个数组.我可以从闭包内打印数组的内容,但在它之外,数组是空的.
import Foundation
import Parse
class WallPostQuery {
var result = [WallPost]()
func getWallImages() -> [WallPost] {
let query = WallPost.query()!
query.findObjectsInBackgroundWithBlock { objects, error in
if error == nil {
if let objects = objects as? [WallPost] {
self.result = objects
//This line will print the three PFObjects I have
println(self.result)
}
}
}
//this line prints [] ...empty array?
println(result)
return self.result
}
}
Run Code Online (Sandbox Code Playgroud)
如何从闭包中获取值?
我正在尝试建立一个回调系统,其中任何回调都可以通过包含在另一个回调中来修改它在调用它之前或之后的行为.此代码有效:
type Closure = Box<Fn(&i32) -> i32>;
fn foo() {
let add_closure = |closure: Closure| {
let bar: Closure = Box::new(move |x| {
println!("{}", x);
closure(x)
});
};
add_closure(Box::new(|&x| x + 2));
}
fn main() {
foo()
}
Run Code Online (Sandbox Code Playgroud)
但是只要我将生命周期边界添加到闭包中,它就不会:
type Closure<'a> = Box<Fn(&'a i32) -> i32>;
fn foo<'a>() {
let add_closure = |closure: Closure<'a>| {
let bar: Closure<'a> = Box::new(move |x| {
println!("{}", x);
closure(x)
});
};
add_closure(Box::new(|&x| x + 2));
}
fn main() {
foo()
}
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
./vec_closure.rs:5:32: 8:11 …Run Code Online (Sandbox Code Playgroud) 似乎功能迭代器正在取代JS中for循环的使用。
与for / while循环相比,传递诸如map或reduce比较之类的函数有什么好处?
var numbers = [1, 4, 9];
var doubles = numbers.map(function(num) {
return num * 2;
});
var doubles = [];
for (i = 0; i < numbers.length; i++) {
doubles[i] = numbers[i] * 2;
}
Run Code Online (Sandbox Code Playgroud) 我有以下关闭
def closure = {
println ("closure code")
}
Run Code Online (Sandbox Code Playgroud)
我想为它添加一个方法.但如果我试试
closure.metaClass.fun = { c->
c.call();
println ("extra code");
}
Run Code Online (Sandbox Code Playgroud)
我得到一个例外
groovy.lang.MissingPropertyException: No such property: fun for class: org.codehaus.groovy.runtime.metaclass.ClosureMetaClass
Run Code Online (Sandbox Code Playgroud)
读另一个答案,我也盲目地试着打电话
ExpandoMetaClass.enableGlobally()
Run Code Online (Sandbox Code Playgroud)
但它不起作用.
有没有办法实现我想要的东西?
我是Spark的新手,对封口感到疑惑.
我有两个RDD,一个包含ID和值列表,另一个包含所选ID列表.
使用map,我想增加元素的值,如果另一个RDD包含它的ID,就像这样.
val ids = sc.parallelize(List(1,2,10,5))
val vals = sc.parallelize(List((1, 0), (2, 0), (3,0), (4,0)))
vals.map( v => {
if(ids.collect().contains(v._1)){
(v._1, 1)
}
})
Run Code Online (Sandbox Code Playgroud)
然而,工作挂起并永远不会完成.这样做的正确方法是什么,谢谢你的帮助!
closures ×10
function ×2
javascript ×2
rust ×2
swift ×2
apache-spark ×1
generics ×1
go ×1
groovy ×1
lambda ×1
loops ×1
objective-c ×1
optional ×1
scala ×1