Rustにチャレンジ 2019/12/4 adventcalender 


今日は、AdventCalenderの4日目になります

# Rust？
最近、SNSで話題になっているなーと思いつつ、せっかくなので空き時間で
チャレンジしてみました( ﾟДﾟ)

# 使いやすい?
学習して合計5日ぐらいなので「俺たちはわからない、感覚で書いている」という状態です。

# 環境について
RustのPlayGround ( https://play.rust-lang.org/ ) を使いました

# 今回作ったときの手順
1.過去に作っていたプログラミング言語で簡単なプログラムを用意する
お仕事のソースコードとかは持ってこれないので、ある程度書きなれている言語で
お題を考えながら用意してみる

僕は、Ruby(普段PHPやPythonのLL系が多いので)で以下のようなコードを用意しました


```rb
# Your code here!

# XR簡易ゲームのコンソールイメージで３択ゲームとして実装


# じゃんけんなので、0=グー、1=ちょき、2=パー

srand(Time.now.to_i)
player_value = rand(3)
# issue 正式版は、標準入力から取得をする
# ローカルだとタイムアウトするので、sleepはコメントアウトする

puts "じゃんけんを開始するよ"

# 入力の代わりに3秒待たせる
#sleep(3)

puts "それじゃあ、いくよ"

#sleep(1)

puts "じゃーんけん"

# 5秒ぐらい待っている
#sleep(5)


puts "ぽんっ"

# お互いに手を繰り出すモーションの待機時間
#select(2)



# 判定をする
def judge(select_value)
  # CPU側のじゃんけんをランダムで実行をする
  # issue 倍率によって、じゃんけんで使う手立ての確率を変更する
  srand(Time.now.to_i)
  cpu_value = rand(3)
  result_hash = Array.new(3, Array.new(3, ""))
  # issue 定数の初期化で一括記載
  result_hash[0][0] = "あいこだよ"
  result_hash[0][1] = "勝ちだよ"
  result_hash[0][2] = "負けだよ"
  result_hash[1][0] = "負けだよ"
  result_hash[1][1] = "あいこだよ"
  result_hash[1][2] = "勝ちだよ"
  result_hash[2][0] = "勝ちだよ"
  result_hash[2][1] = "負けだよ"
  result_hash[2][2] = "あいこだよ"
  hands = Array.new(3, "")
  hands[0] = "ぐー"
  hands[1] = "ちょき"
  hands[2] = "ぱー"
  puts "プレイヤー：%s CPU : %s 結果は %s" % [ hands[select_value] , hands[cpu_value] , result_hash[select_value][cpu_value] ]
  puts select_value
  puts cpu_value
end


# じゃんけんで入力のフェイクとしてスリープをする
puts judge(player_value)

```

```rust
Rustに移植してみたバージョンです

extern crate rand;
use rand::Rng;
use std::process::Command;
use std::string;
use std::vec;


fn main() {
//    let mut rng = rand::thread_rng();
//    let i: i32 = rng.gen();

    game_opening();
    
    // 2秒待機
    
    // じゃんけん判定処理を呼び出す
    judge(0);
    

}


fn waitfor_value(_w: string::String) -> () {
  let mut child = Command::new("sleep").arg(_w).spawn().unwrap();
  let _result = child.wait().unwrap();
}


// ゲームオープニング処理
fn game_opening() {
    println!("じゃんけんを開始するよ");
    
    // 3秒
    let before_string = "3";
    waitfor_value(before_string.to_string());
    
    println!("それじゃあ、行くよ");
    
    // 1秒
    let start_string = "1";
    waitfor_value(start_string.to_string());
    
    
    println!("じゃーんけん");
    
    // 5秒
    let action_string = "5";
    waitfor_value(action_string.to_string());
    
    println!("ぽんっ");

}

// じゃんけん判定処理
fn judge(_s: i32) -> () {

  // CPU側のじゃんけんをランダムで実行をする

  // じゃんけんで、0~2を指定
  let num = rand::thread_rng().gen_range(0, 2);
  
  // CPU手数
  let cpu_num = rand::thread_rng().gen_range(0, 2);
  
  // じゃんけん判定用配列を用意
  let display_name = vec!["グー", "チョキ", "パー"];
  let display;
  // グーの場合
  // issue 配列周りをplay-ground rustで書けるようにして、きれいにする
  if num == 0 {
    if cpu_num == 0 {
        display = "あいこ";
    } else if cpu_num == 1 {
        display = "かち";
    } else {
        display = "まけ";
    }
  } else if num == 1 {
    if cpu_num == 0 {
        display = "まけ";
    } else if cpu_num == 1 {
        display = "かち";
    } else {
        display = "あいこ";
    }
  } else {
    if cpu_num == 0 {
        display = "かち";
    } else if cpu_num == 1 {
        display = "まけ";
    } else {
        display = "あいこ";
    }
  }
  
  // じゃんけんの結果を表示する
  //  puts "プレイヤー：%s CPU : %s 結果は %s" % [ hands[select_value] , hands[cpu_value] , result_hash[select_value][cpu_value] ]
  println!("プレイヤー: {} CPU ： {} 結果は {} だよ", display_name[num].to_string(),  display_name[num].to_string(), display.to_string());
  //  puts select_value
  //  puts cpu_value

    
}

```




# 改めて自分自身での移植をやってみてどうだったの
1.お題があると、プログラム言語の習熟に集中しやすい

言語の仕様を把握していない段階なので、サンプルがない状態でうーんと考えるよりは”これを移植しよう”って考えると言語学習に集中できました。

2.移植元があると、参考にしやすい

これは、他のアプリでもいいのですが参考になるものがあると挙動が違うな等
の参考になりました

3. ちょっと転職とか、お話がしやすそう
移植業務が多かった方向けですが、"双方の言語が読める"と、"移植元と移植先の動きを確認しながら差異がある場合は、相談したり提案してくれる"という指標でポートフォリオに入れてもいいかなと思いました。

＊コード修正やリプレースが多かったので

# 実行結果
youtubeのURLだけちらっと公開

# この記事のissue
フローチャート追加する予定です
＊ほかの日が終わったら、


以上、次回はyumemi_vueの女の子を用意して後半レポートを書くよ( ﾟДﾟ)