18
票
承認済み
Rustに於いての「.iter()」メソッド等イテレータの存在意義とは
こんにちは。ちょっと長くなりますが、お付き合い下さい。
Code 1とCode 2の違い
まずは本題にお答えすると、Code 1とCode2では所有権の扱いが異なります。後程説明しますが、Code 1もCode 2も(内部的に)イテレータを使ったコードになっているので、イテレータを使うかどうかという違いはないです。
Code 1では vec! で作られた値を参照しており、 Code 2では ...
9
票
承認済み
なぜ`Result<T>`で値が返ってくるのか
こんにちは。unwrap や Result の話はドキュメントのエラーハンドリングに詳しく書かれているのですが、質問から察するにRustのコードとりあえず書いてみて、生じた疑問を書いている状況でしょうか。そういう想定の下、回答します。
ひとまず、質問に対する直接的な回答は「unwrapで取り出す値以外の可能性もあるから」です。以下にこれを丁寧に説明します。
まず、 ...
8
票
承認済み
Rustのreqwestを使ったJSON APIの扱いについて
他の方からのコメントにもありますが、reqwestは0.10から非同期IO(async/await)に対応し、APIが変わりました。従来の方法(同期式のブロッキングIO)を行うときは、モジュール名の書き換えが必要になります。
ブロッキングIOの使い方ですが、まず、Cargo.tomlのdependencyを以下のように書き換えて、reqwestクレートのblockingフィーチャをオンにします。
...
8
票
承認済み
��字列に対するcollectの型処理について
1. FromIterator<&str> for &str がない理由
&str は借用された文字列の型です。より端的には「どこかに既にある文字列を指す」ことしかできません。
T: FromIterator<A> は「Aを集めて新たにTを作る」ものですから、「どこかに既にある文字列」の型である &str を直接作るためには使えないのです。
...
7
票
承認済み
Rustのmapなどで繋げて記載した場合のエラーハンドリングについて
こんにちは、κeenです。
エラーが出て困っているわけではなくてエラーを適切に処理する方法を知りたいということでよろしいですか?
Rustでは回復不可能なパニックと、値として取り扱えるエラーは区別されています。今回はパニックが出て困っているのでエラーにしたいという質問として受け取りました。
以下のように書き換えるのはどうでしょう。
// * .unwrap() を使うとパニックになってしまい、...
7
票
Rustのmap関数に関して
こんにちは。
1.
Rustではメソッドは各型毎に名前空間が分離されているのでイテレータでなくてもmapを実装可能です。
struct YourType<T>(T);
impl<T> YourType<T> {
fn map(&self) {
println!("your map");
}
}
...
6
票
なぜ`Result<T>`で値が返ってくるのか
関数の中には処理に失敗する可能性があるものもあります。たとえば、文字列を数字に変換する関数は入力の文字列が "1" なら整数の 1 に変換できますが、 "abc" では変換できません。また、ファイルを開いたり、ファイルから読み込んだり、書き込んだりする関数も処理に失敗する可能性があります(ファイルが存在しない、ディスクの空きスペースがなくなったなど)
...
6
票
承認済み
rust で書いた (cli) ���プリを、素朴なサーバー(e.g. ec2 など)にデプロイする際のステップは?
Rustでアプリを開発するときの基本的な手順はすでにご存知であるという前提で回答しますね。例えばCargo.tomlで依存クレートを指定したり、cargo build --releaseでアプリをビルドしたりする方法については知っているものとします。(ご存知なければこの辺を読んでくださ���)
Rustはコンパイル言語ですので、Rubyなどのスクリプト言語とは異なり、...
6
票
承認済み
マルチスレッドで配列の和を取りたい
thread::spawnで生成したスレッドに変数をムーブ(所有権を移動)するには、その変数が 'static ライフタイムを持っている必要があります。生成されたスレッドの処理は、おおもとのプロセスが終了する(メインスレッドが終了する)まではどこまでも続く可能性があるからです。
pick_array関数のライフタイムを明示的に書くと次のようになり、質問にある通りpicked_arr と&...
6
票
承認済み
Rustからshell関数を使いたい
~/.bashrcはシェルを対話的に実行するときに読み込まれるものなので、bash -cでコマンドを非対話的に実行する時には読み込まれません。
目的の関数を呼ぶ前に~/.bashrcを読み込んでやれば動くと思います。
let output = std::process::Command::new("bash")
.args(&["-c", &...
5
票
承認済み
impl Add<&MyType> for MyType はアンチパターン?
use num::*;
fn test(a: &BigRational, b: BigRational) {
let _c = a + b;
}
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=abad30b3a3c21ea293716ff4a3b6211a
...
5
票
承認済み
Rustの所有権周りについて
このエラー内容は、変数wordがループの各イテレーションの中だけでしか有効ではなく、頭2文字のスライスをHashMapに格納するのに必要な期間より短いというライフタイム周りのエラーです。
解決策としては、sw[i].to_string() で新たにString型の値を生成していますが、これは必要がないので、元のString型の変数sの一部を指しているスライスであるsw[i]...
5
票
承認済み
scraperでfor文を使わないで上手くプログラムする方法
最終形
最終的にどのようなプログラムになればよいのかが少し分からなかったのですが、おそらくこういうことでしょうか?
// ...(省略)...
let v: Vec<_> = document
.select(&selector)
.flat_map(|item| item.select(&ul))
.flat_map(|item| item....
5
票
承認済み
Rustでのエラー『type parameter `_` must be used as the type parameter for some local type』について。
これはtypemap::Keyが外部で定義されているから無理ということなのでしょうか?
概ねそのような理由です。具体的にはOrphan Rule(孤児規則)と呼ばれる制約に引っかかっています。自分で定義していないトレイトを自分で定義していない型に対して(今回はジェネリクスなので定義していない型も含んでいます)実装できるとすると、複数人が同じことをした場合に実装が複数存在して一貫性がなくなります。...
5
票
rust-ndarrayのdot()を用いるとリンクエラーが起きます
リンクエラー発生時のtomlファイルが
[dependencies]
ndarray = "0.11.0"
であったのを
[dependencies]
ndarray = { version = "0.11.0", feature = ["blas"] }
blas-src = { version = "0.2.0", default-features = false, features = [...
5
票
承認済み
flat_mapの中で async/awaitを使う場合
こんにちは。
質問への直接的な回答、つまり flat_map の中で async の文脈を作るには |n| async { gen_list(&n).await.unwrap() } のように、 async {} ブロックで囲んであげることですが、これだとコンパイルは通りません。
やりたいことは Vec<impl Future<Item = Vec<T>>&...
5
票
承認済み
RustのResultについての質問 error[E0277]: the size for values of type `str` cannot be known at compilation time
こんにちは。
Result のエラーはどのようにして解決すべきなのでしょうか?
これはいくつかのエラーが複合しているので、1つ1つ解説します。
まずはエラーメッセージそのもの、「the size for values of type str cannot be known at compilation time」について
str を &'static str にすれば解決します。 ...
5
票
Rust で `MutexGuard` は `Send` でないため、`.await` をまたいで利用できないはずなのにできてしまう
Rust のコミュニティで同じ質問をして解決しました。
Send が要求されるのはあくまでも「tokio::spawn で作成されるタスク」に対してなので、tokio::spawn を利用していない今回のケースでは、問題が起こらない
ということのようです。
なので、上記のコードは問題なくコンパイルされますが、下記のようなコードではコンパイルエラーが起きます:
use std::sync::...
4
票
承認済み
rust-docの使い方が分からない(該当ドキュメントを探すもrustdocに埋もれて出てこない)
RustにはRubyのriのようなコマンドライン向けのドキュメントリーダーはありません。RustではHTML形式のドキュメントをWebブラウザで閲覧します。
rustupでRustをインストールしたなら、以下のコマンドを実行すると、ローカルのPC上にインストールされたドキュメント(HTMLファイル)をWebブラウザで開けます。
$ rustup doc # https://...
4
票
承認済み
Rustで安全にthread loopを止める方法
こんにちは。κeenです。
Rustでスレッドに終了メッセージを送るにはいくつか方法があります。
1つ目は AtomicBool を使って終了フラグを共有する方法。コードだと以下のようになります。
use std::sync::atomic::{AtomicBool, Ordering};
use std::sync::Arc;
use std::{thread, time};
pub ...
4
票
承認済み
Rustのジェネリックで関連型が特定の型であることを保証する方法
<Output = T>のように関連型の型を指定できる記法があります(コンパイルを通すためにCopyも付加しました).
fn fib<T>(a: T, b: T, n: usize) -> T
where
T: std::ops::Add<Output = T> + Copy,
{
match n {
0 => a,
...
4
票
承認済み
あるVectorの要素を別のVectorの要素として参照したい
こんにちは。
参照をデータ構造の中に持つのはライフタイムに慣れてないと中々難しいですね。特にアプリケーション全体の設計にも関わるので正直なところデータ構造だけを提示されても正しい解決策が出せるかは怪しいです。
一応、下記の通りライフタイムを指定すればコンパイルの通るコードは作れます。しかしこれをそのままseino2005さんのアプリケーションに適用して同様にコンパイルが通るかは分かりません。...
4
票
承認済み
warning[E0502]: cannot borrow `c` as immutable because it is also borrowed as mutable
今回の現象を説明するには、3段階のステップがあります。
普通は1つの式の中で同じ値に対する可変参照を2個作ったり、可変参照と共有参照を両方作ったりはできない(借用の基本ルール)
ただし、一時変数を作る手間を省くために、共有参照を使うのが可変参照を使うより前で終了することが明確に示せるシンプルな場合のみ、例外的に許可されて一時変数を作っているのと等価な扱いになる。(two-phase borrow)
...
4
票
wasmでランダムな値を取得したい
termoshttさんの言っていることに加えて以下をCargo.tomlに追記すると.wasmファイルを生成できるはずです。
[lib]
crate-type = ["cdylib"]
この記述の役割が気になる場合はThe Manifest Formatを参照するとよいでしょう。
しかしこれでもまだrandクレートが動作しないはずです。
...
4
票
承認済み
rustで二次元vectorをfor文でunpackして受け取るには?
こんにちは。
回答の前に前提として、Rustの標準ライブラリに「2次元ベクトル」という型はありません。Vec<Vec<T>> という型が表現しているのは「ベクトルのベクトル」です。
どういうことかというと、以下のように長さが不揃いなベクトルも格納できるということです。
let a = vec![
vec![],
vec![1, 2],
vec![10, 20,...
4
票
RUSTのプログラムについて: cannot find macro `mime` in this scope
こんにちは。見たところ、古いコード例を参考にしているようですね。
mime マクロがあるのは mime 0.2系までで、お使いのmime 0.3.16 では使えません。また、 iron 0.5系が依存しているのもmime 0.2系なので、 Cargo.tomlの mime = "0.3.16" の箇所を mime = "0.2" と書き換えるとコンパイルは通ります。
...
4
票
承認済み
rustにてmutableなvecに自身の要素を追加しようとするとコンパイラのバージョンによっては借用errorになる
エラーの理由は、Indexアクセスを行う時に所有権の借用が行われるからです。
質問者さんのコードを例に記述いたしますと
1.「.push(」でmutable参照の借用が開始され
2.「fib[]」でimmutable参照の借用が開始され(Indexトレイト)
3.「);」でfib借用のライフタイムが終了
という流れになります。
恐らく察しが付いたと思いますが
これはRustの借用ルール(...
4
票
rustの#[xxx]や#![xxx]はどういう意味ですか?
#![hoge]のようなものはInner attributeと呼ばれるもので、そのスコープに属性を付与するものです。
例えば、示されたコードにある#![feature(proc_macro_hygiene, decl_macro)]は、「このスコープで、不安定機能proc_macro_hygieneとdecl_macroを有効にする」という意味を持ちます。
#[fuga]のようなものはOuter ...
4
票
承認済み
Rust/WinRTでクリップボードのデータを取得できない
DataTransferのClipboardを使う場合は、メッセージループがあるスレッドでClipboardのAPIを呼び出さなければなりません。
https://github.com/microsoft/windows-rs/issues/317#issuecomment-683430909
あわせてfuturesを使う場合は、...
4
票
承認済み
クロージャを渡す関数にenumの名前のみを渡す
現時点では私も完全な答えがわからないので、わかるところについて回答します。(後でもし何か分かったら追記します → 追記しました)
なお、Rubyでは Symbol#to_proc を使って、メソッド名からブロック(クロージャ)を生成できます。オブジェクトを文字列に変換する to_s メソッドにこれを使うと、 [1, 2, 3].map(&:to_s) == [1, 2, 3].map {|...
無効化に投票
関連するタグ
rust × 110network × 2
windows-10 × 2
p2p × 2
webassembly × 2
windows × 1
c × 1
git × 1
vscode × 1
json × 1
http × 1
virtualbox × 1
oauth × 1
wsl × 1
socket × 1
shell × 1
プログラミング言語 × 1
ポインタ × 1
cmake × 1
build × 1
esp32 × 1
key-mapping × 1
key-binding × 1
combine × 1
openapi × 1