如何在Rust中重新实现jQuery样式的链接?

时间:2018-10-17 01:19:07

标签: rust borrow-checker borrowing

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());

不,不!借阅检查器又来了!

我该如何实现这种行为,如果您不介意的话,请尽可能描述一下为什么。这个问题确实是帮助理解语言的一个例子。

0 个答案:

没有答案