< 返回版块

LacneQin 发表于 2020-02-24 22:50

Tags:rust

Rust/WinRT即将到来

在过去五个月左右的时间里,团队一直在疯狂地研究Rust / WinRT,因此我团队在rust方面的努力仍在继续。我期待着尽快向社区开放。即使那样,这仍将是早期的日子,但仍有很多工作要做,我们基本上同意建立语言投影大约需要三年。自然地,这其中蕴含着十分大的价值。

仍然可以使用Rust / WinRT进行API调用,并且看到它们结合在一起非常令人满意。因此,我将带给您一些先睹为快的信息,以使您了解Rust中调用Windows API的外观。这是古老的Windows.Foundation.Uri类:

use windows::foundation::*;
 
let uri = Uri::create_uri("https://kennykerr.ca")?;
assert!(uri.domain()? == "kennykerr.ca");
assert!(uri.port()? == 443);
assert!(uri.to_string()? == "https://kennykerr.ca/");

这是使用Windows.ApplicationModel.DataTransfer命名空间将一些值复制到剪贴板的另一个示例:

use windows::application_model::data_transfer::*;
 
let content = DataPackage::new()?;
content.set_text("Rust/WinRT")?;
 
Clipboard::set_content(content)?;
Clipboard::flush()?;

这里我们调用了DataPackage的默认构造函数,但是Rust当然没有构造函数。因此,默认构造函数被常规的new方法替换。

最后,这是使用Windows.UI.Composition API的示例:

use windows::foundation::numerics::*;
use windows::ui::composition::*;
use windows::ui::*;
 
let compositor = Compositor::new()?;
let visual = compositor.create_sprite_visual()?;
let red = Colors::red()?;
assert!(red == Color { a: 255, r: 255, g: 0, b: 0 });
 
let brush = compositor.create_color_brush_with_color(red)?;
visual.set_brush(brush)?;
 
visual.set_offset(Vector3 { x: 1.0, y: 2.0, z: 3.0, })?;
assert!(visual.offset()? == Vector3 { x: 1.0, y: 2.0, z: 3.0 });

在这里您可以看到我们正在创建一个合成器。我们使用合成器使用红色笔刷创建一个精灵视觉效果,然后设置视觉效果的偏移量。这看起来很简单,但这证明了Rust / WinRT的开发已经进行了大量工作,以使其看起来像Rust一样自然和原生。Composition API是Windows API中仅有的两种类型层次结构之一,需要特别注意才能正确使用任何语言,更不用说缺乏传统继承的语言了。

Rust / WinRT允许您使用直接从描述API的规范元数据中即时生成的代码调用,现在和将来的任何 Windows API,然后直接进入您的Rust包,在其中您可以像调用另一个一样调用它们的rust模块。

博客原文:https://kennykerr.ca/2020/02/22/rust-winrt-coming-soon/

Plotly for Rust

由Plotly JS支持的Rust绘图库。

Plotly的功能

绘制折现与散点图

extern crate plotly;
use plotly::charts::{Mode, Scatter};
use plotly::Plot;

fn line_and_scatter_plot() {
    let trace1 = Scatter::new(vec![1, 2, 3, 4], vec![10, 15, 13, 17])
        .name("trace1")
        .mode(Mode::Markers);
    let trace2 = Scatter::new(vec![2, 3, 4, 5], vec![16, 5, 11, 9])
        .name("trace2")
        .mode(Mode::Lines);
    let trace3 = Scatter::new(vec![1, 2, 3, 4], vec![12, 9, 15, 12]).name("trace3");

    let mut plot = Plot::new();
    plot.add_trace(trace1);
    plot.add_trace(trace2);
    plot.add_trace(trace3);
    plot.show();
}

fn main() -> std::io::Result<()> {
    line_and_scatter_plot();
    Ok(())
}

extern crate plotly;
use plotly::charts::{Line, LineShape, Legend, Font};
use plotly::charts::Layout;
use plotly::charts::{Mode, Scatter};
use plotly::Plot;

fn line_shape_options_for_interpolation() {
    let trace1 = Scatter::new(vec![1, 2, 3, 4, 5], vec![1, 3, 2, 3, 1])
        .mode(Mode::LinesMarkers)
        .name("linear")
        .line(Line::new().shape(LineShape::Linear));
    let trace2 = Scatter::new(vec![1, 2, 3, 4, 5], vec![6, 8, 7, 8, 6])
        .mode(Mode::LinesMarkers)
        .name("spline")
        .line(Line::new().shape(LineShape::Spline));
    let trace3 = Scatter::new(vec![1, 2, 3, 4, 5], vec![11, 13, 12, 13, 11])
        .mode(Mode::LinesMarkers)
        .name("vhv")
        .line(Line::new().shape(LineShape::Vhv));
    let trace4 = Scatter::new(vec![1, 2, 3, 4, 5], vec![16, 18, 17, 18, 16])
        .mode(Mode::LinesMarkers)
        .name("hvh")
        .line(Line::new().shape(LineShape::Hvh));
    let trace5 = Scatter::new(vec![1, 2, 3, 4, 5], vec![21, 23, 22, 23, 21])
        .mode(Mode::LinesMarkers)
        .name("vh")
        .line(Line::new().shape(LineShape::Vh));
    let trace6 = Scatter::new(vec![1, 2, 3, 4, 5], vec![26, 28, 27, 28, 26])
        .mode(Mode::LinesMarkers)
        .name("hv")
        .line(Line::new().shape(LineShape::Hv));

    let mut plot = Plot::new();
    let layout = Layout::new()
        .legend(Legend::new().y(0.5).trace_order("reversed")
            .font(Font::new().size(16)));
    plot.add_layout(layout);
    plot.add_trace(trace1);
    plot.add_trace(trace2);
    plot.add_trace(trace3);
    plot.add_trace(trace4);
    plot.add_trace(trace5);
    plot.add_trace(trace6);
    plot.show();
}

fn main() -> std::io::Result<()> {
    line_shape_options_for_interpolation();
    Ok(())
}

了解其更多用法与工程源码请访问GitHub仓库

高度灵活的可用于管理和协调JWT工作流的库

特点

  • 管理和协调JWT以进行用户登录、注销和续订
  • 异步就绪
  • 轻松启动
  • 没有不安全的代码
  • 在稳定的rust下运行
  • 库方法(不需要运行时调用)
  • 支持可插拔组件
  • 更新新的刷新令牌后使旧的刷新无效
  • 更新新的身份验证令牌后使旧的身份验证无效
  • 在身份验证令牌到期时处理Thundering herd问题

目前工程需要添加更多示,并提高覆盖率。

前往GitHub仓库了解更多。


From 日报小组 @Lance

日报订阅地址:

独立日报订阅地址:

社区学习交流平台订阅:

评论区

写评论

还没有评论

1 共 0 条评论, 1 页