JavaScript jQuery所提供的便利之一就是chain methods的功能,如下所示:
$(document).ready(function() {
$('#dvContent')
.addClass('dummy')
.css('color', 'red')
.fadeIn('slow');
});
代替更冗长的非链接式书写方式:
$(document).ready(function() {
$('#dvContent').addClass('dummy');
$('#dvContent').css('color', 'red');
$('#dvContent').fadeIn('slow');
});
上面的jQuery代码由jquerybyexample.net提供。
这是可能的,因为jQuery中的$(selector)
函数返回了对selector
所指示内容的jQuery引用,这对于不返回某种类型值(即否则为void
),以从$(selector)
返回jQuery引用,以便链中的下一个函数可以使用它。
但是,在Rust中,这似乎是不可能的。
让我们在伪锈迹中实现这一点:
fn $(selector: &Selector) -> JQueryReference {
JQuery::get(selector)
}
到目前为止一切都很好...
impl Chainable for JQueryReference {
fn addClass(&self, class: String) -> Self {
deep_frontendy_stuff_add_class(&self, class);
self
}
}
哦,不行,deep_frontendy_stuff_add_class()
函数不能修改self
。哦,我知道,我只是使引用变得可变!
impl Chainable for JQueryReference {
fn addClass(&mut self, class: String) -> Self {
deep_frontendy_stuff_add_class(&mut self, class);
self
}
}
很酷,确实有效!但是等等,如果我想去上学而不使用奇特的链式类型怎么办?
$("#dvContent".to_string()).addClass("dummy".to_string());
$("#dvContent".to_string()).css("color".to_string(), "red".to_string());
不,不!借阅检查器又来了!
我该如何实现这种行为,如果您不介意的话,请尽可能描述一下为什么。这个问题确实是帮助理解语言的一个例子。