環 R 上の多項式 R[x] とは, 有限個の R の元の組の全体 R[x] に以下の代数構造を入れたもの. 多項式 p(x) in R[x] と元 r in R の和 p(x) + r 多項式 p(x), q(x) in R[x] の和 p(x) q(x) 多項式 p(x) in R[x] と元 r in R の積 r p(x) 多項式 p(x), q(x) in R[x] の和 p(x) + q(x) 多項式 p(x) in R[x] に元 r in R を代入する: p(r) 多項式 p(x) in R[x] に多項式 q in R[x] を代入する: f(q(x)) R[x] はこの和と積に関して環をなす. より詳細な多項式環の性質については wikipedia 参照. これを Rust で実装する. ジェネリクスとトレイト境界のよい練習になった. 特に多項式への代入として環 R の元と多項式 R[x] のどちらをも許す部分で手間取った. 若干 clone を使い過ぎた気もするけど, 他にどうしようもなさそう. /// 多項式を表す構造体. #[derive(Clone, Debug, PartialEq, Eq)] pub struct Polynomial<T> { coef: Vec<T>, } extern crate num_traits; use num_traits::Zero; use std::ops::{Add, Sub, Neg, Mul}; impl<T> Polynomial<T> where T: Clone + Zero + PartialEq { /// 係数の配列から新しく多項式を生成する. 係数はタプルでもベクトルでもよい. /// 係数 [ a_0, a_1, ... ] の $n$ 番目の要素が $n$ 次項の係数となる. /// /// 引数の配列が要素を持たない可能性を考慮し, `Polynomial::new` 関数の戻り値 /// は `Option<Polynomial>` である. 使用する前に `.unwrap()` する. /// ///
インデントが不揃いなテキストファイルを整形したくなったので Rust コードを書いたお話。 いつかまた使えそうだけど保管するのが面倒なので、ここに放流しておく。 use std::fs::File; use std::io::{BufReader, BufRead, BufWriter, Write}; fn main() { // ファイル読み込み let file = File::open("input.md").unwrap(); let mut reader = BufReader::new(file); // 出力ファイルの確保 let file = File::create("output.md").unwrap(); let mut writer = BufWriter::new(file); // メインループ (各行ごとに処理) loop { // 一行ずつ読み出す let mut buf = String::new(); let num_bytes = reader.read_line(&mut buf).unwrap(); if num_bytes == 0 { // EOF に到達したらループを抜ける break; } else { // そうでないとき, 整形してファイルに書き出す. let output = format_text( buf ); writer.write(output.as_bytes()).unwrap(); } } } // 先頭が " " のとき 4 文字インデントに整形して返し, // そうでなければ入力を返す関数. fn format_text( buf: String ) -> String { if buf.chars().next() == Some(' ') { format!(&