我现在正在学习Rust,似乎我不能将闭包指定为函数参数.这就是我所拥有的:
fn foo(a: i32, f: |i32| -> i32) -> i32 {
f(a)
}
fn main() {
let bar = foo(5, |x| { x + 1 });
println!("{}", bar);
}
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
foo.rs:1:19: 1:20 error: expected type, found `|`
foo.rs:1 fn foo(a: i32, f: |i32| -> i32) -> i32 {
Run Code Online (Sandbox Code Playgroud)
好的,所以它不喜欢闭包语法.这有点烦人,因为现在我必须这样写:
fn foo(a: i32, f: Box<Fn(i32) -> i32>) -> i32 {
f(a)
}
fn main() {
let bar = foo(5, Box::new(|x| { x + 1 }));
println!("{}", bar);
}
Run Code Online (Sandbox Code Playgroud)
发生什么了?我在几个不同的地方读过第一个例子是有效的,所以删除了这个"闭包类型参数"语法,或者我只是做错了什么?
说我有以下指令:
myApp.directive('myDirective', function() {
return {
restrict: 'A',
require: 'ngModel',
scope: {
ngModel: '='
},
link: function(scope, elem, attrs, ngModelCtrl) {
scope.$watch('ngModel', function() {
ngModelCtrl.$modelValue = 'foo';
});
}
}
});
Run Code Online (Sandbox Code Playgroud)
以下html:
<input ng-model="name" my-directive></input>
Run Code Online (Sandbox Code Playgroud)
基本上,每当用户更改输入时,my-directive理想情况下将内部模型值更改为"foo",同时保持视图值不变.
但是当我$scope.name在相应的控制器中打印出来时,它不记录"foo",它会记录用户输入的内容.
看起来这ngModelCtrl.$modelValue不是控制器正在访问的 - 我是不正确地接近这个问题?
(另外观察ngModel范围感觉确实是错误的,但我不确定是否有任何其他方式.任何建议都会非常感激!)
这是我的设置:我正在使用用户登录构建服务(使用Negroni和Gorilla),在登录时,用户获取会话cookie,服务器使用该cookie来授权受保护的端点.其中一个受保护的端点允许用户/客户端使用服务器打开websocket,如下所示:
app := negroni.New()
r := mux.NewRouter()
r.HandleFunc("/auth/connection", func(rw http.ResponseWriter, req *http.Request) {
// authorize request using req.Cookie("session_id")
// create websocket
conn, err := upgrader.Upgrade(rw, req, nil)
if err != nil {
panic(err)
}
defer conn.Close()
// do stuff...
})
app.UseHandler(r)
app.Run(":3000")
Run Code Online (Sandbox Code Playgroud)
但是,req.Cookies()总是空的,这意味着我不能授权任何请求"/auth/connection"- 而且我几乎肯定它不是websocket客户端的问题(如果你很好奇,我正在使用这个Python包测试它:https ://github.com/liris/websocket-client).我是否正确接近websocket的身份验证?
任何帮助/建议将不胜感激!
我正在尝试通过响应对象检索请求的正文.
var request = require('request');
request({
...
body: {
foo: 'bar'
}
}, function(err, res, body) {
var reqBody = res.request.body;
});
Run Code Online (Sandbox Code Playgroud)
但是请求体现在是一个缓冲区.如何将其转换回JavaScript对象?
注意:在发出http请求之前,我无法将请求体存储在范围较大的变量中.
我正在尝试在Angular中使用一次性绑定.我有以下HTML:
<img ng-src="{{::photo.src}}"/>
Run Code Online (Sandbox Code Playgroud)
页面加载时,Angular会抛出此错误:
Syntax Error: Token ':' not a primary expression at column 1 of the expression [::photo.src] starting at [::photo.src]
Run Code Online (Sandbox Code Playgroud)
我在几个不同的地方读到这可能是由于表达式中的前导空格......但正如你所看到的,我的代码中没有前导空格.如果我确实添加了前导空格,我当然会得到相同的错误(但在第2列).
我正在使用Angular的1.3.10版本,因此我认为包含了一次性绑定.
任何帮助将不胜感激!
编辑:似乎我错了 - 我实际上使用的是版本1.2.24,所以还没有支持一次性绑定.感谢@sss指出这一点.
我正试图解除AWS S3异步功能,并遇到一个奇怪的错误.鉴于以下代码,
var s3 = new AWS.S3();
var when = require('when');
var nodefn = require('when/node');
var getObjectP = nodefn.lift(s3.getObject);
getObjectP({
Bucket: 'bucket_name',
Key: 'key_name'
})
.then(function(data) {
...
}, function(err) {
...
});
Run Code Online (Sandbox Code Playgroud)
我收到这个错误,
Object #<Object> has no method 'makeRequest'
Run Code Online (Sandbox Code Playgroud)
这是getObject通常的样子(当我使用回调而不是promises时,它工作正常):
s3.getObject({ ... }, function(err, data) {
...
});
Run Code Online (Sandbox Code Playgroud)
我在滥用nodefn.lift吗?这看起来很简单.这是所有感兴趣的人的文档.https://github.com/cujojs/when/blob/master/docs/api.md#nodelift
我开始疯狂地尝试让 Go 解码这个 json 请求正文。这是一个示例请求:
curl -X POST -d "{\"username\":\"foo\", \"password\":\"bar\"}" http://localhost:3000/users
Run Code Online (Sandbox Code Playgroud)
这是我的处理程序:
mux.HandleFunc("/users", func(rw http.ResponseWriter, req *http.Request) {
var body struct {
username string
password string
}
// buf := make([]byte, req.ContentLength)
// req.Body.Read(buf)
// fmt.Println(string(buf))
//
// The above commented out code will correctly print:
// {"username":"foo", "password":"bar"}
err := json.NewDecoder(req.Body).Decode(&body)
if err != nil {
rw.WriteHeader(http.StatusNotAcceptable)
return
}
fmt.Printf("%+v\n", body)
// prints -> {username: password:}
})
Run Code Online (Sandbox Code Playgroud)
就像评论所暗示的那样,我可以验证这req.Body确实是正确的 - 但无论出于何种原因,json.NewDecoder(req.Body).Decode(&body)永远不会填写 的字段body。
任何帮助将不胜感激!
我正在尝试初始化一个装箱的None值片段,以便基础类型T不需要实现Cloneor Copy。这里有一些理想的解决方案:
fn by_vec<T>() -> Box<[Option<T>]> {
vec![None; 5].into_boxed_slice()
}
fn by_arr<T>() -> Box<[Option<T>]> {
Box::new([None; 5])
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,by_vec实施需要T: Clone,by_arr实施也需要T: Copy。我尝试了更多方法:
fn by_vec2<T>() -> Box<[Option<T>]> {
let v = &mut Vec::with_capacity(5);
for i in 0..v.len() {
v[i] = None;
}
v.into_boxed_slice() // Doesn't work: cannot move out of borrowed content
}
fn by_iter<T>() -> Box<[Option<T>]> {
(0..5).map(|_| None).collect::<Vec<Option<T>>>().into_boxed_slice()
}
Run Code Online (Sandbox Code Playgroud)
by_vec2没有通过编译器(我不确定我理解为什么),但是by_iter可以。我担心的性能collect- …