Rust By Example 第6章 変換 日本語訳

Rust By Example 第6章だけ日本語訳がなかったので翻訳しました。プルリクを投げるほど自分の翻訳に自信がなかったのでブログに載せます。


6.1 FromInto

FromトレイトとIntoトレイトは本質的に関連しています。and this is actually part of its implementation. もしも型Bから型Aへ変換できるなら、普通、型Aから型Bへ変換することもできるはずです。

From

Fromトレイトによって、ある型に、他の型からその型への変換を定義でき、複数の型の間での非常に単純な変換システムを提供することができます。標準ライブラリには、プリミティブ型や一般的な型の変換のためにこのトレイトの実装がいくつも存在します。

例えば、簡単にstrStringに変換できます。

let my_str = "hello":
let my_string = String::from(my_str);

同じように、独自の型にも変換を定義できます。

use std::convert::From;

#[derive(Debug)]
struct Number {
    value: i32,
}

impl From<i32> for Number {
    fn from(item: i32) -> Self {
        Number { value: item }
    }
}

fn main() {
    let num = Number::from(30);
    println!("My number is {:?}", num);
}

Into

IntoトレイトはFromトレイトの対になるものです。つまり、もしもある型にFromが実装されていたら、Intoはその実装を必要に応じて呼び出すということです。

コンパイル時に変換先の型を決定することができるように、Intoトレイトを使用する際は、変換先の型を明示する必要があります。しかし、型変換の機能を自由に使えるので、この小さなトレードオフは許容可能なものです。

use std::convert::From;

#[derive(Debug)]
struct Number {
    value: i32,
}

impl From<i32> for Number {
    fn from(item: i32) -> Self {
        Number { value: item }
    }
}

fn main() {
    let int = 5;
    // Try removing the type declaration
    // 型宣言を除去してみよう
    let num: Number = int.into();
    println!("My number is {:?}", num);
}

Copylight (c) 2021 orient-ex
Released under the MIT License
https://opensource.org/licenses/MIT

アニメのキャラが全然覚えられない

覚えられないわけではない。顔、名前の文字、名前の音はすべて覚えられるけれど、それらを対応させることが全然できない。名前と顔を一致させられないという話はよく聞くが、名前の文字と名前の音の対応もあやふやなのは珍しいのではないか。
というわけで、私にとってアニメは、キャラの顔、キャラの名前の文字、キャラの名前の音の3つのレイヤーが互いに独立に物語を繰り広げているように見えて、ストーリーをうまく把握できない。

Autorunsのエントリーの色の意味

Autoruns のエントリーの背景色は基本的に白だが、ピンク色や黄色の事がある。ヘルプを見ても色の意味が書かれていなかった。調べたところ、

  • ピンク色 ... 発行者などの情報がない
  • 黄色 ... ファイルが見つからない

という意味らしい1

小学生(当時)のぼくがかんがえたさいきょうのプログラミング言語

Javaを勉強したての頃に考えたプログラミング言語の仕様。当時は小6か中1だったはず。 クラスとインスタンスの違いもわからない状態で仕様を考えたのでめちゃくちゃです。
gotoで何でもしようとしてるのが面白いね。
sinとsoutという名前は、当時C++に若干浮気していたからです。
標準入出力の機能をわざわざ予約語として用意しているのは、当時Javaでの標準入力が難しすぎて躓いていたからだと思います。

当然処理系はありません。

仕様書(笑)はいくつかありますが、どれも未完成です。Javaとの対比という形で文法が説明されています。なかなかおもしろいと思うので公開します。

BP言語0.1.0 仕様書(0.0) 2015-05-10

==================================================
予約語
    予約語は変数名や、クラス名、メソッド名、ラベル名には使えません。
    --- 一覧 ----------------------------
    予約語   例                     java
    if      if:i == j:
                /*処理*/
            ;                       if(i == j){
                                        /*処理*/
                                    ;
    --------------------------------------------------------
    else    else:i == j:
                /*処理*/
            ;                       else if(i == j){
                                        /*処理*/
                                    }
    --------------------------------------------------------
    else    else::
                /*処理*/
            ;                       else{
                                        /*処理*/
                                    }
    --------------------------------------------------------
    loop    loop:2:
                /*処理*/
            }                       while(!(i == 2)){
                                        /*処理*/
                                    }
    --------------------------------------------------------
    while   while:i == j:
                /*処理*/
            ;                       while(i == j){
                                        /*処理*/
                                    }
    --------------------------------------------------------
    sin     sin:str;                BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
                                    String str = input.readLine();
    --------------------------------------------------------
    sout    sout:"Hello";           System.out.print("Hello");
    --------------------------------------------------------
    for     for:i=0:i<=5:i=i+1:
                /*処理*/
            ;                       for(i=0; i<=5; i=i+1;){
                                        /*処理*/
                                    }
    --------------------------------------------------------
    goto    :public,static:void:main(string[].args, int.a):
                /*処理*/
            ;
            goto::main:(str[], i);  public static void main(String[] args, int a){
                                        /*処理*/
                                    }
                                    CLASS cl = new CLASS();
                                    cl.main(str[], i);
    --------------------------------------------------------
    
==================================================
goto
    --- 使い方 -----------------------------------------------
    No. BP                              java
    --------------------------------------------------------
    1   goto::CLASS.main:;              CLASS.main();
    --------------------------------------------------------
    2   goto::CLASS.main:str, i;        CLASS.main(str, i);
    --------------------------------------------------------
    3   goto:i:CLASS.main:;             i = CLASS.main();
    --------------------------------------------------------
    4   goto:i:CLASS.main:str, ch;      i = CLASS.main(str, ch);
    --------------------------------------------------------
    goto文は、
        goto : 戻り値を受ける変数名 : クラス名.メソッド名 : 引数1, 引数2… ;
    のようにかく。
    ただし、処理するメソッドが同じクラスにあるときは、
        goto : 戻り値を受ける変数名 : .メソッド名 : 引数1, 引数2… ;
    のようにかくこともできる。
    
    
    --------------------------------------------------------
    5   goto::LABEL:;                   break label;
    6   goto:::;                        break;
    --------------------------------------------------------
    goto :: LABEL :;
    のようにかくと、指定されたラベルが付けられたブロックを抜ける。
    
    
    --- まとめ ------------------------------------------------
    --------------------------------------------------------
    通常
        goto : 戻り値を受ける変数名 : クラス名.メソッド名 : 引数1, 引数2… ;
            ・import文が必要。
            ・行き先のメソッドで、end文が処理されるとこの文のつぎの文が処理される。
    --------------------------------------------------------
    処理するメソッドが同じクラスにあるとき
        goto : 戻り値を受ける変数名 : .メソッド名 : 引数1, 引数2… ;
            ・メソッド名の前に、"."をつける。
            ・行き先のメソッドで、end文が処理されるとこの文のつぎの文が処理される。
    --------------------------------------------------------
    指定されたラベルが付けられたブロックを抜けるとき
        goto :: LABEL :;
    --------------------------------------------------------
    いちばん内側のブロックを抜けるとき
        goto:::;
    --------------------------------------------------------
    --------------------------------------------------------
    
==================================================
クラスの宣言

クラスを宣言するには、
    : 修飾子1, 修飾子2, … : class : クラス名 :
        /* クラスの内容 */
    ;
のようにかく。

==================================================
メソッドの宣言

メソッドを宣言するには、
    : 修飾子1, 修飾子2, … : 戻り値の型 : メソッド名 :
        /* メソッドの内容 */
    ;
    
BP言語0.0.3仕様書 0.2  2015-04-29

==========================================================================
1. 拡張子
    .bp

==========================================================================
2. 大文字と小文字
    BPコンパイラは、大文字と小文字を区別しない。

==========================================================================
3. コメント
    3.1 1行コメント
        -----------------------------
        |   ?? ここにコメントを書く   |
        -----------------------------
        の様に、??で始まる。
    3.2 複数行コメント
        複数行コメントはありません。

==========================================================================
4. リテラル
    リテラルには、文字、文字列、整数(int)、整数(long)、浮遊小数点数、がある。
    ---記述例----------------------------------------
    文字              :'a'
    文字列           :"aaa"
    整数  (int)       :123
    整数  (long)      :123L
    浮遊小数点数      :12.98
    ------------------------------------------------

==========================================================================
BP言語仕様 0.0.2


========================================================================================

文は、

コマンド名:処理1:処理2;

のように":"で区切り、";"で終わる。


========================================================================================

コメントは、

??コメント

のように"??"で始まり、Unicode:U+000Aで終わる(複数行には又がらない)。


========================================================================================

リテラルには、文字、文字列、整数、浮遊小数点数、がある。

---記述例----------------------------------------
文字          :'a'
文字列       :"aaa"
整数          :123
浮遊小数点数  :12.98
------------------------------------------------


========================================================================================


制御文には、if文、else文、else if文、goto文、loop文、for文、while文、do-while文、がある。

---記述例----------------------------------------
if          if:条件式:処理;
else        else::処理;
else if     else if:条件式:処理;
goto        goto:飛び込み先;
loop        loop:処理の回数:処理;
for         for:(初期化式):条件式:(変化式):処理;
while       while:条件式:処理;
do-while    do_:処理:_while:条件式;
------------------------------------------------


========================================================================================

---コマンド一覧------------------------------------
コマンド                内容                      例                         java

break               ループから抜け出す         while:i == 1:               while(i == 1){
                                                break;                      break;
                                            ;                           }

char                文字型変数の宣言            char:let;                   char let;

sin                 入力                      cin:let;                    BufferedReader br = new BufferedReader 
                                                                            (new InputStreamReader (System.in));
                                                                            String str = br.readLine( );
sout                出力                      cout:"hello\n";             System.out.print("hello\n");

double              浮動小数点数型               double:d;                   double d;
                    64ビット浮動小数点数
                    の宣言

do-while            繰り返し                    do:                     do{
                                                cout:"\ni:";                System.out.print("\ni:");
                                                cout:i;                     System.out.print(i);
                                                i:i+1;                  i = i + 1;
                                            :while:!(i == 5);           }while(!(i == 5))

else                条件分岐                    else::                      else{
                                                cout:"See you\n";           System.out.print("See you\n");
                                            ;                           }

else if             条件分岐                    else:i == 0:                else if(i == 0){
                                                cout:"Hi\n";                System.out.print("Hi\n");
                                            ;                           }

end                 ブロックの終わり            box:                        void box(){
                                                end:;                       return null;
                                            ;                           }

exit                プログラムの終わり         box:                        void box(){
                                                exit:0;                     System.exit(0);
                                            ;                           }

for                 繰り返し                    for:(i:0;):i<=5:(i:i+1): for(i=0; i<=5; i=i+1;){
                                                cout:"\ni:";                System.out.print("\ni:");
                                                cout:i;                     System.out.print(i);
                                            ;                           }

goto                飛び込み                    label:                      label:{
                                                goto:label;                 break label:
                                            ;                           }

if                  条件分岐                    if:i==1:                    if(i==1){
                                                                            
                                            ;                           }

int                 整数型                   int:i;                      int i;
                    32ビット符号つき変数の宣言

long                整数型
                    64ビット符号つき変数の宣言      long:l;                     long l;

loop                n回繰り返す                loop:5:                     for(i=0;i<=5;i++;){
                                            ;                           }

string              文字列型変数の宣言         string:str;                 string str;

while               繰り返し                    while:i==0:                 while(i==0){
                                            ;                           }

-------------------------------------------------


========================================================================================

変数

---変数の種類--------------------------------------

型         意味                              大きさ   範囲

char        文字型                           8b      u0000~uffff
int         整数型 32ビット符号つき               32b     -2147483648~+2147483647
long        整数型 64ビット符号つき               64b     -9223372036854775808~+9223372036854775807
double      浮動小数点数型 64ビット浮動小数点数 64b     IEEE754-1985
string      文字列型                            --      --

-------------------------------------------------

代入の方法

char:'a';
int:123;
long:123L;
double:123.4;
string:"Abc";


========================================================================================

エスケープ
"\"または"¥"を使用する。

---エスケープ一覧-----------------------------------

記述          意味
\n          
\t
\b
\r
\f
\\
\¥
\'
\"
\000
\u0000

コーディングスタイル考古学

古いコードの変数名は、現在では考えられないような、短い変な名前になっていることが多い。コーディングスタイル考古学では、過去のコーディングスタイルを分析し、時代・地域ごとのコーディングスタイルを再現することを目指す。