Rust By Example 第6章 変換 日本語訳
Rust By Example 第6章だけ日本語訳がなかったので翻訳しました。プルリクを投げるほど自分の翻訳に自信がなかったのでブログに載せます。
6.1 From と Into
FromトレイトとIntoトレイトは本質的に関連しています。and this is actually part of its implementation. もしも型Bから型Aへ変換できるなら、普通、型Aから型Bへ変換することもできるはずです。
From
Fromトレイトによって、ある型に、他の型からその型への変換を定義でき、複数の型の間での非常に単純な変換システムを提供することができます。標準ライブラリには、プリミティブ型や一般的な型の変換のためにこのトレイトの実装がいくつも存在します。
例えば、簡単にstrをStringに変換できます。
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
コーディングスタイル考古学
古いコードの変数名は、現在では考えられないような、短い変な名前になっていることが多い。コーディングスタイル考古学では、過去のコーディングスタイルを分析し、時代・地域ごとのコーディングスタイルを再現することを目指す。