#gui #rust #recommended https://github.com/hecrj/iced
🤔 啊!这个有意思! SMVU(State, Message, View logic, Update logic) 提纲得好!
应用的状态是 State,Message 可以触发改变它的逻辑
State 本身也需要 View 来渲染,State 改变了就需要 Update
🤔 啊!这个有意思! SMVU(State, Message, View logic, Update logic) 提纲得好!
应用的状态是 State,Message 可以触发改变它的逻辑
State 本身也需要 View 来渲染,State 改变了就需要 Update
GitHub
GitHub - iced-rs/iced: A cross-platform GUI library for Rust, inspired by Elm
A cross-platform GUI library for Rust, inspired by Elm - iced-rs/iced
https://guide.elm-lang.org/ 好像 #Haskell 的语法啊 🤔 case of 还有等号函数定义、layout……
guide.elm-lang.org
Introduction · An Introduction to Elm
import Browser
import Dom.Widgets exposing (div, Text, Button)
import Dom.Events exposing (onClick)
main = Browser.sandbox { init = 0, view = view, update = update }
update state message =
case msg of
"inc" -> state + 1
else -> state
view state =
div [
Text ["$state"]
Button ["inc", "inc"]
] 🤔没看几眼就开始默写了,不会
duangsuse::Echo
import Browser import Dom.Widgets exposing (div, Text, Button) import Dom.Events exposing (onClick) main = Browser.sandbox { init = 0, view = view, update = update } update state message = case msg of "inc" -> state + 1 else -> state view state…
好了,我懂了。
import Browser
import Html exposing (Dom, div, button)
import Html.Events exposing (onClick)
type Msg = Increment | Decrement
main = Browser.sandbox { init = 0, view = view, update = update }
view model =
div [], [
([div [text model] ])
(button [text "+1"] [onClick Increment]),
(button [text "-1"] [onClick Decrement])
]
update msg model =
case msg of
Increment -> model + 1
Decrement -> model - 1我觉得这一遍应该可以去试水了 🤔
好了,没想到是这种参数顺序…… 我还以为
https://elm-lang.org/examples/buttons
module Main exposing (..)
import Browser
import Html exposing (Html, div, text, button)
import Html.Events exposing (onClick)
type alias Model = Int
type Msg = Increase | Decrease
main = Browser.sandbox { init = 0, view = view, update = update }
view model =
div []
[
div [] [text (String.fromInt model)],
button [onClick Decrease] [text "-1"],
button [onClick Increase] [text "+1"]
]
update msg model =
case msg of
Increase -> model + 1
Decrease -> model - 1 好了,没想到是这种参数顺序…… 我还以为
f [a 1] [b "?"] 是 "keyword argument" 呢https://elm-lang.org/examples/buttons
duangsuse::Echo
我觉得这一遍应该可以去试水了 🤔 module Main exposing (..) import Browser import Html exposing (Html, div, text, button) import Html.Events exposing (onClick) type alias Model = Int type Msg = Increase | Decrease main = Browser.sandbox { init = 0, view = view, update =…
其实刚才我觉得
刚才我才发现,只要参数列表不加逗号就是利用 layout 了,不过那还是需要先知道参数个数才能不预取字符。
view 定义里,div 的参数列表的 layout 文法很复杂,说明 Elm 的语法实现起来很困难,不能不预取字符就判断是否开启新 layout 深度 🤔刚才我才发现,只要参数列表不加逗号就是利用 layout 了,不过那还是需要先知道参数个数才能不预取字符。
duangsuse::Echo
我觉得这一遍应该可以去试水了 🤔 module Main exposing (..) import Browser import Html exposing (Html, div, text, button) import Html.Events exposing (onClick) type alias Model = Int type Msg = Increase | Decrease main = Browser.sandbox { init = 0, view = view, update =…
我再来复写下 Random die (1-6) :
module Main exposing (..)
import Browser
import Html exposing (Html, text, button)
import Html.Events (onClick)
import Random
type alias Model = { dieFace: Int }
type Msg = Roll | NewFace Int
view : Model -> Html Msg
view model =
div []
[
text (String.formInt mode.dieFace),
button [onClick Roll] [text "Roll"]
]
update: Msg -> Model -> (Model, Cmd)
update msg model =
case Msg of
Roll -> (model, Cmd.none)
(NewFace x) -> (Model { dieFace = x }, Random.rand dieFace (1..6))
subscriptors = Sub.none
duangsuse::Echo
我再来复写下 Random die (1-6) : module Main exposing (..) import Browser import Html exposing (Html, text, button) import Html.Events (onClick) import Random type alias Model = { dieFace: Int } type Msg = Roll | NewFace Int view : Model -> Html Msg view model…
……等等,不就是个 Effect 嘛,我又会了
module Main exposing (..)
import Browser
import Html exposing (Html, div, h1, text, button)
import Html.Events exposing (onClick)
import Random
type alias Model { dieFace: Int }
type Msg = Roll | NewFace Int
view model =
div []
[
h1 [] [text (String.fromInt mode.dieFace)],
button [onClick Roll] [text "Roll"]
]
update : Msg -> Model -> (Model, Cmd Msg)
update msg model =
case msg of
Roll -> (model, Random.rand (1..6))
(NewFace x) -> (Model x, Cmd.none)
subscription = Sub.noneimport Browser
import Html exposing (..)
import Html.Events exposing (onClick)
import Random
type alias Model = { dieFace: Int }
type Msg = Roll | NewFace Int
main = Browser.element { init = init, view = view, update = update, subscriptions = subscriptions }
init : () -> (Model, Cmd Msg)
init _ = (Model 0, Cmd.none)
view : Model -> Html Msg
view model =
div []
[
h1 [] [text (String.fromInt model.dieFace)],
button [onClick Roll] [text "Roll"]
]
update : Msg -> Model -> (Model, Cmd Msg)
update msg model =
case msg of
Roll -> (model, Random.generate NewFace (Random.int 1 6))
(NewFace x) -> (Model x, Cmd.none)
subscriptions : Model -> Sub Msg
subscriptions model = Sub.nonehttps://elm-lang.org/examples/cat-gifs
很有意思,所有的视图更新都是在 update 里完成的,Message 则同时负责把数据送至 update 函数
State 都是 immutable 的,这样虽然会造成一些复杂性,但总体来看对程序的简洁性和规范性有很大帮助
很有意思,所有的视图更新都是在 update 里完成的,Message 则同时负责把数据送至 update 函数
State 都是 immutable 的,这样虽然会造成一些复杂性,但总体来看对程序的简洁性和规范性有很大帮助
extern crate azul;
use azul::{ prelude::*, widgets::{ label::Label, button::Button } };
struct DataModel {
counter: usize
}
impl Layout for DataModel {
fn layout(&self, _info: LayoutInfo<DataModel>) -> Dom<DataModel> {
let label = Label::new(format!("{}", self.state.counter)).dom();
let btn_inc = Button::with_label("+1").dom().with_callback(Callback(on_inc_clicked));
Dom::div().with_child(label).with_child(btn_inc);
}
fn on_inc_clicked(&self, info: CallbackInfo<DataModel>) -> UpdateScreen {
info.state.counter += 1
Redraw
}
}
fn main() {
let mut app = App::new(AppOpts::default(), css::native).unwrap();
let win_main = app.create_window("Counter", WindowOpts::default()).unwrap();
app.run(win_main).unwrap();
}又写错了一个分号,需要值的地方只有语句
感觉脑子里没有类型一样,难道不知道可以用
with_callback 也忘记加事件了
忘记
App 需要 data model 参数和 AppConfig、create_window 用的名字是 WindowCreateOptions,明白了吗?
(迫真自我批评中)
感觉脑子里没有类型一样,难道不知道可以用
Self 吗? &self 引用了哪里来的 self.state.counter?with_callback 也忘记加事件了
忘记
impl for 里不该写什么了App 需要 data model 参数和 AppConfig、create_window 用的名字是 WindowCreateOptions,明白了吗?
(迫真自我批评中)
extern crate azul;
use azul::{ prelude::*, widgets::{ label::Label, button::Button } };
struct DataModel {
counter: usize,
}
impl Layout for DataModel {
fn layout(&self, _info: LayoutInfo<Self>) -> Dom<Self> {
let label = Label::new(format!("{}", self.counter)).dom();
let btn_inc = Button::with_label("+1").dom().with_callback(On::ButtonUp, Callback(on_inc_clicked));
Dom::div().with_child(label).with_child(btn_inc)
}
}
fn on_inc_clicked(event: CallbackInfo<DataModel>) -> UpdateScreen {
event.state.counter += 1
Redraw
}
fn main() {
let mut app = App::new(DataModel { counter: 0 }, AppConfig::default()).unwrap();
let win_main = app.create_window(WindowCreateOptions::default(), css::native()).unwrap();
app.run(win_main).unwrap();
}还是少写了个 data,event.state.data.counter,唉,我应该清楚 state 不止 user data 的,就是不动脑子分析。
with_callback 也是临时突然忘了,想起有
最后的
with_callback 也是临时突然忘了,想起有
with_ 再试试 with_event, with_handler 后才推出的最后的
fn main() 倒是写对了Forwarded from Solidot
LLVM 10.0.0 发布
LLVM 编译器套装项目释出了 10.0.0 版本。LLVM 项目目前的发布计划为每半年发布一个大版本。10.0.0 版本的主要变化包括:Clang 支持 C++ Concepts;Clang 默认不再运行在一个独立进程上;支持 Windows 10 内置的安全特性 Control Flow Guard (CFG);支持更多处理器核心和特性,等等。更多可浏览 LLVM、Clang、Extra Clang Tools、lld 和 libc++ 的发布公告。Media
https://www.solidot.org/story?sid=63921
LLVM 编译器套装项目释出了 10.0.0 版本。LLVM 项目目前的发布计划为每半年发布一个大版本。10.0.0 版本的主要变化包括:Clang 支持 C++ Concepts;Clang 默认不再运行在一个独立进程上;支持 Windows 10 内置的安全特性 Control Flow Guard (CFG);支持更多处理器核心和特性,等等。更多可浏览 LLVM、Clang、Extra Clang Tools、lld 和 libc++ 的发布公告。Media
https://www.solidot.org/story?sid=63921
duangsuse::Echo
喜欢本频道的内容吗?
看起来不喜欢的人多一些,也罢,反正我不常弄些能吸引人的东西 😂