rustのthread:spawn内でのasync/awaitの使い方

投稿者: Anonymous rustで下記コードのようにthread:spawnの内部でreqwestを利用するとthreadのJoinHandlerの所がコンパイルが通りません。 Rustで上手くthread内でasync/awaitをどのように利用するのが良いでしょうか? use std::thread; use std::thread::JoinHandle; fn main() { let mut xxx = Xxxxx::new().run(); xxx.stop(); } async fn fetch_something() -> Result<(), reqwest::Error> { let body = reqwest::get("https://www.rust-lang.org") .await? .text() .await?; println!("{}", body); Ok(()) } #[derive(Debug)] pub struct Xxxxx { worker: Option<JoinHandle<()>>, } impl Xxxxx { pub fn new() -> Self { Self {…(Continue Reading)

Rust: Vec にトレイトを実装したオブジェクトを格納したい

投稿者: Anonymous スタックに “Trait を実装したオブジェクト” を格納したいです。 Rust では Vec をスタックとして使うのが通例だということで、以下のコードを書いたのですが、Trait のサイズがコンパイル時に定まらないので Vec には格納できません。 (コンパイルエラー) 代替案、または解決策はあるでしょうか。 trait Trait<T>{} struct Struct<T> { a: Vec<Trait<T>> } fn main() {} コンパイルエラーのメッセージは以下です。 error[E0277]: the trait bound `Trait<B> + ‘static: std::marker::Sized` is not satisfied. = note: `Trait<B> + ‘static` does not have a constant size known at compile-time = note: required…(Continue Reading)

仮想マシン上のWebサーバにホストからアクセスできない

投稿者: Anonymous Rustの勉強のため,簡単なWebサーバのプログラムを書いています. VirtualBox上のArch Linuxをサーバとして用い,http://nickel.rs/のHello Worldをcargo runで実行しました.ところが,http://127.0.0.1:portにゲストOS側からアクセスすることはできても,http://guest_ip:portにホストOS側のブラウザからアクセスすることができません.http://ironframework.io/も試してみましたが,同じくアクセスはできませんでした. ここで,ネットワークの問題を疑い,ゲスト側でpython -m http.serverを実行したところ,今度はホスト側からアクセスすることができました.ネットワークが問題ではないのでしょうか? VirtualBoxはブリッジアダプターでネットワークと繋がっており,ホストからpingを打ったり,sshで接続することはできます.rustcのバージョンはrustc 1.0.0 (built 2015-06-01)で,cargoはAURのcargo-binを使用していてバージョンはcargo 0.3.0-nightly (47306a4 2015-06-17) (built 2015-06-18)です. 一体どうすればRustで書いたサーバにアクセスできるでしょうか. 解決 127.0.0.1にbindしても、ローカルホストからしか接続できないことがあります。 ソースコード中でアドレスを記載している部分、 server.listen(“127.0.0.1:6767”); これを、eth0などのネットワークインターフェイスが持つIPアドレス、または0.0.0.0を指定してみてはどうでしょうか。 server.listen(“0.0.0.0:6767”); 回答者: Anonymous

Rustでのエラー『type parameter `_` must be used as the type parameter for some local type』について。

投稿者: Anonymous 現在ironフレームワークを用いたWebプログラミングを勉強しています。 その中でセッション周りの実装の際に、ironが提供するトレイトを実装している型をキーにしていろいろやり取りをするのですが、以下のようにわかりやすく実装しなおそうと思っています。(説明が長くなりますすみません…) セッションを扱うには、自身で定義した2つのstruct(Session, SessionKeyとします)に対し、ironクレートによって提供されているtypemap::Keyトレイトを次のように適用します。 struct Session; // セッションデータとして扱う構造体(自分はHashMapを1つ持つタプル構造体にしています) struct SessionKey; // 関数を呼ぶ際、扱う型を決定するのに使用します // 例)get_ref::<SessionKey>() -> &Sessionが返される impl typemap::Key for SessionKey { type Value = Session; } このようにimplすることで、上の例のようにSessionKeyをキーにしてSession構造体をやり取りします。 わかりやすさのために、typemap::Key, Valueではなく次のような名前で扱おうと考えています。 trait SessionType { type SessionData; } という名前で定義したトレイトと関連型を、 impl SessionType for SessionKey { type SessionData = Session; } 同じようにimplします。 これによって、typemap::Keyのimplは内部に隠しつつ、わかりやすい名前で扱えないかと考えています。 なので次のように実装しました。 extern crate iron; use…(Continue Reading)

warning[E0502]: cannot borrow `c` as immutable because it is also borrowed as mutable

投稿者: Anonymous 以下はパスカルの三角形からnCkを mod 1,000,000,000+7にて求めるプログラムです。 MUsize は演算の際自動でmodをとる構造体です。 演算子オーバーロードを実装した構造体をVectorに格納し実行したところ以下のようなワーニングが出力されてしまいます。Vectorの中身をMUsizeではなくusizeで同じように実装したところワーニングは出ませんでした。MUsizeとそのメソッドをどの様に改変すればワーニングが取れますでしょうか? よろしくお願いします。 この理由としてMUsizeにderiveするトレイトがusizeと比べ何か足りないのではないかと考えております。 /* AtCoder abc 132 解説より https://www.youtube.com/watch?v=mso8tE1yMl8 */ /* 1 1 1 1 2 1 1 3 3 1 aCb はa段目のb番目 */ static MOD: usize = 1_000_000_000 + 7; use std::ops::{AddAssign, SubAssign, MulAssign}; use std::ops::{Add, Sub, Mul}; #[derive(Copy, Clone, Debug)] struct MUsize {x: usize} impl MUsize…(Continue Reading)

Rustの参照(借用)とポインタの違いについて

投稿者: Anonymous Rustを学習中です。参照についてあまりピンときていません。参照はC言語のポインタに借用の概念をもたせたものとして理解していたのですが、その場合次の例がなぜ動くのかがわかりません。 struct Point {x: i32, y: i32} fn main() { let a = Point{x: 100, y: 230}; let b = &a; println!(“{} {}”, a.x, a.y); println!(“{} {}”, b.x, b.y); } これはどちらも100 230を出力します。しかしbはaのポインタなので、.でメンバ変数にアクセスできるのはおかしいのではないかと思いました。 実際Cではアロー演算子を用いてアクセスします。 #include <stdio.h> #include <stdlib.h> struct Point{ int x; int y; }; int main() { struct Point a, *b; a.x =…(Continue Reading)

Rustで安全にthread loopを止める方法

投稿者: Anonymous Rustの無限ループで安全にloop処理から抜ける方法は どの様に書けば良いですか。 use std::{thread, time}; pub struct Worker { } trait WorkerTrait { fn run(&self); fn stop(&self); } impl Worker { fn run(&self) { thread::spawn(move || loop { println!(“worker1 working “); thread::sleep(time::Duration::from_millis(1000)); // 擬似処理. // thread break? }); } fn stop(&self) { // to break thread. } } fn main() { let w…(Continue Reading)

flat_mapの中で async/awaitを使う場合

投稿者: Anonymous flat_map内でFuture functionをコールした場合 どのようにasyncをflat_mapに記述すれば良いですか。 async fn gen_str() -> Result<Vec<String>, String> { Ok(vec![“a”.to_string(), “b”.to_string()]) } async fn gen_list(msg: &str) -> Result<Vec<String>, String> { Ok(vec![format!(“1.{}”, msg), format!(“2.{}”, msg)]) } #[async_std::main] async fn main() { let v = gen_str().await.unwrap(); let list: Vec<String> = v .iter() .flat_map(|n| gen_list(&n).await.unwrap()) .map(|n| n.into()) .collect(); println!(“{:?}”, list); } 上記のコードだと下記のエラーが出てしまいます。 `await` is only…(Continue Reading)

Rustでネットワークライブラリを使う時に標準ライブラリを使えば異なるOS間でもコードを使いまわせますか?

投稿者: Anonymous Rustでネットワークライブラリを使う時に標準ライブラリを使えば異なるOS間でもコードを使いまわせますか? 解決 標準ライブラリ内のstd::net(IPv4/IPv6上でのTCP/UDPプロトコルを扱うライブラリ群)のみを使うコード・ライブラリであればRustがTier1としてサポートしているプラットフォーム全てで動きますので、異なるOS間でもコードを使いまわせます。Tier2、Tier3でも動く可能性は高いですが、Rustデベロッパーは正しく動作することは保証していません。 コンパイラ・標準ライブラリ・cargoそれぞれのサポート状況はこちらで確認できますが、参考までに2016/11/13現在のTier1プラットフォーム(上記3つをすべてサポート)は以下の通りです。 i686-apple-darwin = 32-bit OSX (10.7+, Lion+) i686-pc-windows-gnu = 32-bit MinGW (Windows 7+) i686-pc-windows-msvc = 32-bit MSVC (Windows 7+) i686-unknown-linux-gnu = 32-bit Linux (2.6.18+) x86_64-apple-darwin = 64-bit OSX (10.7+, Lion+) x86_64-pc-windows-gnu = 64-bit MinGW (Windows 7+) x86_64-pc-windows-msvc = 64-bit MSVC (Windows 7+) x86_64-unknown-linux-gnu = 64-bit Linux (2.6.18+) 回答者: Anonymous

serde.rsで構造体をmsgpackの辞書としてシリアライズするには?

投稿者: Anonymous Rustにおいて、自分の定義した構造体 struct MyStruct { a: i32, b: f64, } をmsgpackの辞書として保存するにはどうすれば良いでしょうか? serde_deriveを用いて以下のようにした場合、Listとして保存されてしまいます: extern crate rmp_serde; extern crate serde; #[macro_use] extern crate serde_derive; use serde::Serialize; #[derive(Serialize)] struct A { a: i32, b: f64, } fn main() { let f = ::std::fs::File::create(“test.msg”).ok().unwrap(); let mut buf = ::std::io::BufWriter::new(f); let mut enc = ::rmp_serde::Serializer::new(&mut buf); let val =…(Continue Reading)

Vecのイテレータを消費するには

投稿者: Anonymous 次のように,Vec<T>::iter()をイテレータを消費する関数consume()に対して渡したいのですが, fn consume<T: Iterator<Item=char>>(input: &mut T){ unimplemented!() } fn main(){ let mut buffer = vec![‘a’,’b’,’c’]; consume(&mut buffer.iter()); //type mismatch } 次のようなコンパイルエラーが生じます. prog.rs:7:5: 7:12 error: type mismatch resolving `<core::slice::Iter<‘_, char> as core::iter::Iterator>::Item == char`: expected &-ptr, found char [E0271] bufferはconsume()の呼出し後は破壊されても構いません.どのように書くのが良いでしょうか. 解決 Vecが消費されて困る場合は、clonedメソッドを使ってイテレーターを複製してください。 fn consume<T: Iterator<Item=char>>(input: T){ unimplemented!() } fn main(){ let buffer = vec![‘a’,’b’,’c’];…(Continue Reading)

配列に二重アクセスしたい

投稿者: Anonymous 配列のある要素を一つ取り出して、他の全ての要素と比較して、その値を更新する。 fn main() { let mut v: Vec<f64> = vec![1.0, 2.0, 3.0, 4.0, 5.0]; for xi in 0..v.len() { for (yi, y) in v.iter().enumerate() { if xi != yi { let mut x = &mut v[xi]; if *x < *y { *x += (*y – *x) / 2.0; } println!(“{}”, x); } }…(Continue Reading)

rust で書いた (cli) アプリを、素朴なサーバー(e.g. ec2 など)にデプロイする際のステップは?

投稿者: Anonymous たとえば、 ruby/python/js といったスクリプト系言語で(Web)アプリを記述した場合には、それを用いて実際のサーバーにデプロイする際には、 インタプリター本体を管理するツール(e.g. rbenv/pyenv/nodenv)をいれて、想定バージョンのインタプリタをインストール ソースコードをアップロード パッケージ管理ライブラリ(e.g. gem, pip, npm)を用いて依存ライブラリのインストール を行うかなと思っています。 質問 rust で何かしらの (cli や web) アプリを作成した際に、それを既存の unix 系サーバーにデプロイするにあたっては、どのようなフローが一般的でしょうか? 解決 Rustでアプリを開発するときの基本的な手順はすでにご存知であるという前提で回答しますね。例えばCargo.tomlで依存クレートを指定したり、cargo build –releaseでアプリをビルドしたりする方法については知っているものとします。(ご存知なければこの辺を読んでください) Rustはコンパイル言語ですので、Rubyなどのスクリプト言語とは異なり、アプリを実行する環境にコンパイラなどのRustツールチェインをインストールする必要はありません。開発環境のOSとデプロイ環境のOSが同じなら、基本的にtarget/releaseディレクトリにある単一のバイナリファイルをサーバーにコピーするだけでデプロイが完了します。 例えばUbuntuでビルドしたバイナリをEC2のUbuntu環境にコピーしたときは当然動きますし、同じLinuxなら別のディストリビューション(Amazon Linuxなど)にコピーしても動くのが普通です。 バイナリファイルには依存しているクレートの内容も含まれています。ですから gem installのような操作も不要です。 一方、バイナリファイルに含まれないものもあります。 Webアプリの場合はHTMLテンプレートや画像のようなリソースファイル Rust以外の言語で書かれたライブラリ(ネイティブライブラリなど) 例:MySQL、PostgreSQLのクライアントライブラリ、OpenSSL 前者はバイナリと一緒にコピーして、後者はOSのaptやyumなどのパッケージ管理システムでインストールすることになります。 もし開発環境とデプロイ環境のOSが異なるなら、CIを使って自動ビルドするのが良いでしょう。また、OSが一致する場合でも、手元でビルドすると何かとミスをする機会が増えてしまうので、CIで自動ビルドするほうが安全かもしれません。リポジトリをGitHubに置いているならGitHub Actions、TravisCI、CircleCIなどが使えますし、GitLabに置いているならGitLab Actionsが使えます。 まとめると、 CIをセットアップして、デプロイ環境向けのバイナリを自動ビルドできるようにする Webアプリなどではリソースファイルとバイナリを一緒にしてtarballに固めておく CIで作成したファイルをサーバーにコピーする ネイティブライブラリをサーバーにインストールする なお、Linuxではネイティブライブラリもバイナリに含めることもできます。以前、記事を書いたので参考にしてください。 RustのLinux muslターゲット(その1:Linux向けのポータブルなバイナリを作る) 回答者: Anonymous

Rustのジェネリックで関連型が特定の型であることを保証する方法

投稿者: Anonymous fn fib<T>(a: T, b: T, n: usize) -> T where T: std::ops::Add, // <T as std::ops::Add>::Output == T ??? { match n { 0 => a, 1 => b, _ => fib(a, b, n-1) + fib(a, b, n-2) } } // (計算量については突っ込まないでください) このような計算をする場合、T+T->Tであることをコンパイラに知らせる必要がありますが、その方法はありますか。 解決 <Output = T>のように関連型の型を指定できる記法があります(コンパイルを通すためにCopyも付加しました). fn fib<T>(a: T, b: T, n:…(Continue Reading)

openapi-generatorで生成されたrustのコードでエラーがでる。

投稿者: Anonymous openapi-generatorで以下のコードが生成されたのですが、エラーが出てしまいます。 /* * EPGStation * * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * * The version of the OpenAPI document: 1.5.4 * * Generated by: https://openapi-generator.tech */ #[allow(unused_imports)] use serde_json::Value; #[derive(Debug, Serialize, Deserialize)] pub struct RecordedDeletes { #[serde(rename = “recordedIds”)] pub recorded_ids: Vec<i32>, /// onlyTs: TS だけ削除, onlyEncoded: エンコード済みファイル削除のみ削除 #[serde(rename =…(Continue Reading)

なぜ`Result`で値が返ってくるのか

投稿者: Anonymous Rustの“unwrap()”は何をするものですか?を読んでいて、また、自身の短い経験を通して疑問をいただいたことがあるので質問です。 unwrap()を使うシーンはいくつかあったのですが、なぜそもそもResult<T>のようにunwrap()しないと値を取り出せない形になっているのでしょうか。そのままTで値を返してくれたほうが毎回unwrap()しなくて便利だと思いますがどういった理由が考えられますでしょうか。 解決 こんにちは。unwrap や Result の話はドキュメントのエラーハンドリングに詳しく書かれているのですが、質問から察するにRustのコードとりあえず書いてみて、生じた疑問を書いている状況でしょうか。そういう想定の下、回答します。 ひとまず、質問に対する直接的な回答は「unwrapで取り出す値以外の可能性もあるから」です。以下にこれを丁寧に説明します。 まず、 Rustは例外を使わず返り値で失敗を表します。他言語でいう例外に綺麗に対応するものはありません。しかし失敗する可能性のある計算というのもあります。たとえば文字列を数値にパースするだとかの処理ですね。 そういう成功するか失敗するか分からない計算の返り値に Result が使われます。 参考のリンクに貼られている回答ではResult<T>と書いていますがあれは恐らく省略したかtypoで、本来は Result<T, E> です。Tが成功した場合の値、Eが失敗した場合の値です。 たとえばResult を返す parseは以下のように成功した場合と失敗した場合の処理を記述できます。 fn main() { match “not a number”.parse::<i32>() { Ok(n) => println!(“got a number {}”, n), Err(e) => println!(“failed to parse: {}”, e), } // -> failed to parse: invalid digit found in string…(Continue Reading)

Rustに於いての「.iter()」メソッド等イテレータの存在意義とは

投稿者: Anonymous // Code 1 fn main(){ for vect in vec![0,1,2,3,4,5,6,7,8,9].iter(){ println!(“{}”,vect); } } 例えば上記のコードを実行すると、縦に整列した10個の数字を得ることができます。同時に、 // Code 2 fn main(){ for vect in vec![0,1,2,3,4,5,6,7,8,9]{ println!(“{}”,vect); } } でも同じ結果を得ることができます。ここで本題ですが、Code 1とCode 2では何が異なるのでしょうか? またRustにおけるイテレータの存在意義とは? 自分の古巣のRubyにもイテレーターはありましたが、全てforで解決していたため、結局何のために(目標のデータを反復することには間違いない)用意されているのか疑問に思っていました。参考文献を読んでもイテレーターの存在意義を前もって知っている事を前提に書かれおり非常に悩んでいます。 解決 こんにちは。ちょっと長くなりますが、お付き合い下さい。 Code 1とCode 2の違い まずは本題にお答えすると、Code 1とCode2では所有権の扱いが異なります。後程説明しますが、Code 1もCode 2も(内部的に)イテレータを使ったコードになっているので、イテレータを使うかどうかという違いはないです。 Code 1では vec! で作られた値を参照しており、 Code 2では vec! で作られた値を消費しています。これは1. vect の型が &i32 か i32 か、…(Continue Reading)

RustのStringは「usize」なのか?

投稿者: Anonymous とあるネットワーク系プログラムをRustで書いています。そこでString型が何故かusizeとして認識されてしまっているので質問させていただきます。かなりのコード量な上、検索に引っかかると厄介な個人的事情もありますので、必要な部分のみを掲載させていただきます。予めご了承ください。 問題の箇所 let &ip; let host; let parse_ip; let perse_host; let ipx = &ip; if cli.value_of("ipaddress").is_none() && cli.value_of("hostname").is_none() { println!("{}", HELP); std::process::exit(1); } else if cli.value_of("ipaddress").is_some() || cli.value_of("hostname").is_none() { ip = String::from(cli.value_of("ipaddress").unwrap()); parse_ip = ip.parse::<IpAddr>().unwrap(); } else { host = cli.value_of("hostname").unwrap(); perse_host = || { let hostname: Vec<std::net::IpAddr> = lookup_host(host).unwrap(); let host_to_ip =…(Continue Reading)

関数引数でのrefパターンがmoveを生じさせる理由を知りたい

投稿者: Anonymous Rust言語では ref パターンを使って右辺の式の参照を暗に取る事ができると思います。 // Copyではない適当な型 struct Val{ value: u32 } fn main() { let x: Val = Val { value: 32 }; let rx1: &Val = &x; // 普通に参照を取る let ref rx2: Val = x; // 参照を暗に取る let ref rx3: Val = x; // 何度でも取れる println!(“{}”, x.value); // 単に参照をとっているだけなのでmoveされておらずxは使える } この文法を関数引数で使ってみます。 struct Val…(Continue Reading)

Rustで配列へ細切れに格納されたchar(数字)をi64型整数として返す方法

投稿者: Anonymous プロローグ 現在「HACKING:美しき策謀」という書籍を読んでからというもの、型安全なRustでも「パニックが起こるのはまずいのではないか?」と思い、想定されていない使われ方をしても、エラーメッセージを出力し、正常終了と言う形で結果を返したくなり、以前組んだプログラムを改良しています。 問題 fn t_or_f(x1: i64, ps1: &Vec<i64>) -> bool { for p1 in ps1 { if p1 * p1 > x1 { break; } else if x1 % p1 == 0 { false; } } true } fn prime(n1: i64) { let mut ps2 = vec![2]; let mut x2 = 3; if…(Continue Reading)

Rust: Rc にトレイト std::op::Add を実装させたい

投稿者: Anonymous オペレータオーバーロードしたいです。単純な Struct ならいいのですが、 Rc<Struct> に std::op::Add を実装させようとすると、コンパイルできません。解決策はあるでしょうか。 use std::rc::Rc; use std::ops::Add; struct Struct; // コンパイルできない impl Add for Rc<Struct> { type Output = Rc<Struct>; fn add(self, rhs: Self) -> Self::Output { Rc::new(Struct{}) } } // コンパイルできる impl Add for Struct { type Output = Struct; fn add(self, rhs: Self) -> Self::Output { Struct{}…(Continue Reading)

Rust: Array を定数で満たす場合

投稿者: Anonymous Rust の質問です. 以下のコードはコンパイルエラーになります. fn main() { let a = 100; let b = [0; a]; } エラー: let b = [0; a]; ^ unresolved path in constant expression let a してるのに, どうして a が解決されていないとされてしまってるのでしょうか. よろしくお願いします. 解決 Rustの配列は実行時にサイズを指定できません。aの場所には定数式(constant expression)だけが書けます。 定数式を使った例: // 定数式ならコンパイルできる。 fn main() { let c = [0; 100]; let d = [0;…(Continue Reading)

reqwestで要素が取得できなかった場合にデータベースのレコードを削除したい。

投稿者: Anonymous actix-webを利用してWebアプリを作成しています。 actix-webのハンドラ内でreqwestを使い、データベースに保存されているレコードのURLにアクセスし、結果が得られなかった場合そのレコードを削除するという処理を実装したいと考え以下のコードを実装しましたがエラーが出てしまいました。 コード async fn valid_site(url: &str) -> Result<models::NewBackend, reqwest::Error>{ let backend = reqwest::get(&format!(“{}/.well-known/site.json”, url)) .await? .json() .await?; Ok(backend) } #[get(“/backends/{id}”)] async fn backends_update(hb: web::Data<Handlebars>, pool: web::Data<DbPool>, id: web::Path<String>) -> Result<HttpResponse, Error>{ let conn = pool.get().expect(“cant get db pool”); let id_int: i32 = id.parse().unwrap(); let backend = web::block(move || actions::find_backend(&id_int, &conn)) .await .map_err(|e|…(Continue Reading)

ArcとVecのmutableエラー’cannot borrow as mutable’について

投稿者: Anonymous Vecをthreadで利用するコードを書いた所 cannot borrow as mutableとエラーが出ました。 エラーコード(E0596)にはmutが必要と書いてありますがmutはつけています。 どの様にすればエラーが取れますでしょうか? use std::vec::Vec; use std::sync::Arc; use std::{thread,time}; fn main() { let arc: Arc<Vec<i32>> = Arc::new(Vec::new()); let mut _arc = Arc::clone(&arc); thread::spawn(move || { for x in 1..=10 { _arc.push(x); } }); thread::sleep(time::Duration::from_secs(3)); arc.iter().map(|n| println!(“{:?}”,n)); } error[E0596]: cannot borrow data in a `&` reference as mutable –> src/main.rs:11:13…(Continue Reading)

rust-docの使い方が分からない(該当ドキュメントを探すもrustdocに埋もれて出てこない)

投稿者: Anonymous Rubyのriコマンドと同じコマンドラインリファレンスはないものかと思いdnf search rust docを走らせるとrust-docというパッケージが引っ掛かり、パッケージの説明にも「Documentation for Rust」と書いてあるのでインストールしたのですが、このパッケージに関する詳細(どのように使うのか)が調べてみても見つかりませんでした。いくら調べても見つからず困っています。この問題の解決法をご存知の方居られますでしょうか? 解決 RustにはRubyのriのようなコマンドライン向けのドキュメントリーダーはありません。RustではHTML形式のドキュメントをWebブラウザで閲覧します。 rustupでRustをインストールしたなら、以下のコマンドを実行すると、ローカルのPC上にインストールされたドキュメント(HTMLファイル)をWebブラウザで開けます。 $ rustup doc # https://doc.rust-lang.org/ と同じ内容のページが開く $ rustup doc –std # https://doc.rust-lang.org/std/index.html と同じ内容のページが開く このドキュメントはPCがネットに繋がっていなくても閲覧できます。 rustupによるRustのインストール方法については、こちらのページを参照してください。 回答者: Anonymous

boringsslを利用したcのコードをrustでコンパイルした際のエラー

投稿者: Anonymous boringsslのコードを利用したCのコードをrustから利用するコードを書いてみました。 しかしrust-cmake-boringsslをビルドすると下記の様なビルドエラーが発生します。 ビルドはdockerを利用しましたが利用しなくても同じエラーが発生します。 このコードをCの部分のみcmakeでコンパイルを行うと問題なくビルドできるので、 rustからcmakeした場合のエラーだと考えていますがどの様に対処すれば良いですか? docker build -t rust-cmake-boringssl . {{ 省略 }} error: linking with `cc` failed: exit code: 1 | = note: “cc” “-Wl,–as-needed” “-Wl,-z,noexecstack” “-m64” “-L” “/usr/local/rustup/toolchains/1.33.0-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib” “/code/target/debug/deps/rust_cmake_boringssl-fb053db5baf0cc90.1z90sxbskcq91ebx.rcgu.o” “/code/target/debug/deps/rust_cmake_boringssl-fb053db5baf0cc90.32b6g9lzimjgj8n5.rcgu.o” “/code/target/debug/deps/rust_cmake_boringssl-fb053db5baf0cc90.3aaj4mjxb5lkmrkm.rcgu.o” “/code/target/debug/deps/rust_cmake_boringssl-fb053db5baf0cc90.3w55c3jafb2ycbej.rcgu.o” “/code/target/debug/deps/rust_cmake_boringssl-fb053db5baf0cc90.4qt5y1bkawfo9iio.rcgu.o” “/code/target/debug/deps/rust_cmake_boringssl-fb053db5baf0cc90.50pl6qnwdthi9gy2.rcgu.o” “/code/target/debug/deps/rust_cmake_boringssl-fb053db5baf0cc90.56k8nal2xxr6ch6x.rcgu.o” “/code/target/debug/deps/rust_cmake_boringssl-fb053db5baf0cc90.rm8ok0x2wiym41u.rcgu.o” “-o” “/code/target/debug/deps/rust_cmake_boringssl-fb053db5baf0cc90” “/code/target/debug/deps/rust_cmake_boringssl-fb053db5baf0cc90.2omngnxgh3s0uvu7.rcgu.o” “-Wl,–gc-sections” “-pie” “-Wl,-zrelro” “-Wl,-znow” “-nodefaultlibs” “-L” “/code/target/debug/deps” “-L” “/code/target/debug/build/rust-cmake-boringssl-982a83fbad3f69a0/out” “-L” “/usr/local/rustup/toolchains/1.33.0-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib” “-Wl,-Bstatic”…(Continue Reading)

Rust以外の言語でイミュータブルな変数の値を書き換えると、どのような挙動を起こすのか?

投稿者: Anonymous 変数の値をミュータブルやイミュータブルに変更できる言語はRust以外にも数多くあると思いますが、これらの言語でイミュータブルな変数を外部から書き換える場合は、どのような挙動を起こすのでしょうか?「外部から書き換える」とはRustで表すとこんな感じです。 //スケッチ1 fn main() { let x = 1; println!(“変数の値は{}”, x); x = 2; //ここで直接ではなく、外部から書き換えている。 println!(“新し変数の値は{}”, x); } 公式ドキュメントによると、 <中略>なぜなら、この状況はまさしく、バグに繋がるからです。コードのある部分は、 値が変わることはないという前提のもとに処理を行い、別の部分がその値を変更していたら、 最初の部分が目論見通りに動いていない可能性があるのです。このようなバグの発生は、 事実(訳注:実際にプログラムを走らせた結果のことと思われる)の後には追いかけづらいものです。 特に第2のコード片が、値を時々しか変えない場合尚更です。 参照URL(https://doc.rust-jp.rs/book/second-edition/ch03-01-variables-and-mutability.html#a変数と可変性) という解説がなされていていますが、少々わからない事があります。というのも私自身が設計思想上ゆるい部類の言語であるRubyでプログラムの組まれ方学んだ人間なので、そもそもミュータブル・イミュータブルを採用した言語への理解が進んでいないというのが現状で、よって、 値が変わることはないという前提のもとに処理を行い、別の部分がその値を変更していたら、 最初の部分が目論見通りに動いていない可能性があるのです。 の記述のイメージが少々つきにくい部分があります。これらを踏まえてお伺いしたいことをリストアップすると、 変数のミュータブル・イミュータブルを採用した言語で(イメージとしての)上記のようなスケッチを実行させると、どのような結果が出るのでしょうか? 変数のミュータブル・イミュータブルを採用したコンパイル言語で、上記のスケッチをコンパイルして、それが通った場合どのような不具合が出るのでしょうか(言語名も挙げてもらえると嬉しいです。)? 解決 「外部から書き換える」がどういうコードを指しているのか想像できないのですが、一応、以下のような理解で回答しますね。 外部から書き換えるコード → 書き換えが禁止されているイミュータブルな変数を書き換えられる裏技的なコード 以下の言語での経験をもとに書きます。 Rust Scala Erlang 変数のミュータブル・イミュータブルを採用した言語で(イメージとしての)上記のようなスケッチを実行させると、どのような結果が出るのでしょうか? ScalaとErlangではそのような裏技的なコードを見たことがありません。言語仕様上、そういうコードを作るのは無理だと思います。Rustではunsafeなコードを書くことで可能になります。 Rust:unsafeなコードならコンパイルも実行も可能。Rustはシステムプログラミングを可能にするために、安全でないコードもサポートしている。 Scala:そういうコードは書けない。イミュータブルな変数を書き換えようとするとコンパイルエラーになる。 Erlang:Erlangでは=はRustやScalaと少し違う意味を持つのでx = 2に相当する式は合法であり、コンパイルできる。しかし実行時にxの値(つまり1)と2をパターンマッチできないというエラーになる。開発者はその実行時エラーによって、イミュータブルな変数を書き換えようとしていたことに気づく。 Rustの場合、たとえば以下のように書けます。 fn main() { let x…(Continue Reading)

actix-webで早期にレスポンスを返したい。

投稿者: Anonymous Rustのactix-webで条件を満たしたときにエラーレスポンスを返したく以下の通り実装しましたがエラーが出てしまいました。 #[post(“/backends”)] async fn add_backend( pool: web::Data<DbPool>, form: web::Json<forms::BackendForm>, ) -> Result<HttpResponse, Error>{ let resp = reqwest::get(&format!(“{}/version”, form.url)) .await .map_err(|e| { eprintln!(“{}”, e); HttpResponse::BadRequest().finish() })?; if resp.status() != http::StatusCode::OK{ HttpResponse::BadRequest().finish() } let version = resp.text() .await .map_err(|e| { eprintln!(“{}”, e); HttpResponse::BadRequest().finish() })?; if version == “”{ Ok(HttpResponse::BadRequest().finish()) } let conn = pool.get().expect(“cant get…(Continue Reading)

Rustの型エラーで二次元配列が書き換えられない

投稿者: Anonymous 最近Rustを学び始めて,現在以下のようなコードを書いています. static TABLE:[[u8; 4]; 4] =[ [ 3, 6, 7, 14], [ 1, 11, 13, 5], [ 8, 2, 4, 9], [10, 15, 0, 12] ]; fn main() { let mut input: [[u8; 2]; 4] = [[4, 8], [3, 10], [9, 1], [0, 3]]; let output = func(input, TABLE); for row in output.iter()…(Continue Reading)

Rustのreqwestを使ったJSON APIの扱いについて

投稿者: Anonymous reqwestを使って、とあるJSON APIを呼び出そうとしています。レスポンスを構造体に格納してResultに含んで返し、外部関数から呼び出せるようにしたいのですが、コンパイルが通らず、しばらく格闘したのですが解決方法が見つからないため、ご教授いただきたいです。 ソースコード const STEAM_API_KEY: &str = “****”; const STEAM_ID: &str = “****”; use serde::{Deserialize, Serialize}; #[derive(Serialize, Deserialize, Debug)] struct Stats { detail: Detail, } #[derive(Serialize, Deserialize, Debug)] struct Detail { name: String, value: i64, } #[derive(Serialize, Deserialize, Debug)] struct PlayerStats { steamid: String, gamename: String, stats: Stats, } pub fn stats() ->…(Continue Reading)