【Week 6】my_help, ruby_second



# はじめに

マルチスケールシミュレーション特論]の講義メモです．講義メモのインデックスは[コチラ](<https://qiita.com/e79a93e5b7b1/items/d48ad7b8df544d737a78>)．

今回の参考資料は[チャート式ruby-appendix-I(bash + emacs)](<https://qiita.com/daddygongon/items/3ab780f22e620c3f8298>)と[チャート式ruby-II(variable and method)](<https://qiita.com/daddygongon/items/c51f3e0695174bb3c508>)です．


# チャート式 Ruby

参照記事は[コチラ](<https://qiita.com/daddygongon/items/c51f3e0695174bb3c508>)


## variable

前回の講義ではコマンドライン引数として受け取った文字を ARGV[0] を用いて出力するプログラム hello\_name.rb を作成した．

`（参考） hello_name.rb`

```ruby
puts "Hello #{ARGV[0]}."
```

今回は受け取った引数 ARGV[0] を name という変数 (variable) に代入し，出力するプログラムを作成する．

まずは変数 name を用意する必要がある．Ruby では変数の型宣言の必要がない（Python も然り）ため，変数は以下のように定義できる．

```ruby
name = ARGV[0]
```

コマンドライン引数を変数に代入し，出力するプログラム name\_variable.rb を作成したい．はじめに変数 name に "Rudy" を代入して，出力するプログラムを作成する．

```ruby
name = "Rudy"
puts "Hello #{name}."
```

次に ARGV[0] を変数 name に代入し，出力するプログラムにリファクタリングする．

```ruby
name = ARGV[0]
puts "Hello #{name}."
```

これを実行すると

    > ruby name_variable.rb Hiroki.
    Hello Hiroki.

期待どおり受け取った引数を変数に代入し，出力するプログラムを作成できた．


## method

これまでの講義で引数や変数を用いて "Hello xxx." を出力するプログラムを作成してきたが，これらをメソッド化したい．

Rubyではメソッド (method) を定義することで，関数やプロシージャなどを実装できる．メソッドは以下のように定義できる．

`(参考)メソッドの例`

```ruby
def hello(name)
  p name
end
```

name\_variable.rb を参考に，"Hello xxx." を出力するメソッドをプログラム hello\_method.rb に作成する．

まずはじめに hello メソッドを作成・呼び出してみる．

```ruby
def hello (name)
end

name = ARGV[0]
hello (name)
```

メソッド内に処理を書いていないので勿論実行しても何も出力されない．メソッドの引数を出力するように以下のようにメソッドに追記する．

```ruby
def hello (name)
  puts name
end

name = ARGV[0]
hello (name)
```

これを実行すると

    > ruby hello_method.rb Rudy
    Rudy

コマンドラインで受け取った引数を出力するメソッドを作成できた．あとは出力に文字列を加えればよいので，

```ruby
def hello(name)
  puts "Hello #{name}."
end

name = ARGV[0]
hello(name)
```

実行すると

    > Ruby hello_method.rb Rudy
    Hello Rudy.

期待どおり "Hello xxx." を出力する hello メソッドを作成できた．


## TDD

まずTDDとは…

**Test Driven Development**: テスト駆動開発

以下の手順でコーディングを行う

-   テストを作る (test)
-   エラーを出す (red)
-   エラーをなくす (green)
-   code を brush up する (refactoring)

最終目標は **動く綺麗なコードを作る** こと，らしいです．自分もどちらかというと TDD に近いスタイルだった．

折角なので hello\_method.rb をリファクタリングしていく．まずはメソッド名が hello と何をするメソッドか分かりづらいので， puts\_hello に変更する．

```ruby
def puts_hello name
  puts "Hello #{name}."
end

name = ARGV[0]
puts_hello name
```

続いて command の option に名前を指定し忘れた場合，問い合わせるようにしたい．追加する処理は以下のようになる．

```ruby
name = ARGV[0]
if name == nil
  puts "What\'s your name?"
  name = gets.chomp
end
```

上記の処理を gets\_name メソッドとしてプロシージャにまとめる．hello\_method.rb をリファクタリングした後のプログラム hello.rb は以下のとおり．

```ruby
def puts_hello name
  puts "Hello #{name}."
end

def gets_name
  name = ARGV[0]
  if name == nil
    puts "What\'s your name?"
    name = gets.chomp
  end
  return name
end

name = gets_name
puts_hello name
```

htllo\_method.rb と比較して，よりまとまりのある分かり易いプログラムになった．


# Ruby 開発周辺情報

参照記事は[コチラ](<https://qiita.com/daddygongon/items/3ab780f22e620c3f8298>)


## ~~myhelp~~ org-mode

bash や emacs については前回の講義メモにまとめています．

[【Week 5】bash, ruby\_first](<https://qiita.com/e79a93e5b7b1/private/04a670d67cd9a51c247c>)

また，org-mode によるCUIでのメモについて，詳しい内容は以下の記事に随時追加していきます．

[【Memo】Emacs Org-Mode](<https://qiita.com/e79a93e5b7b1/private/878e10f4f11f2f2820c2>)


# 次回の講義内容 <span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-04 Wed&gt;</span></span>

次回の講義は

-   [bundler](<https://qiita.com/daddygongon/items/14218c96df5cbcf35c62>)
-   [if-else, case, array and each](<https://qiita.com/daddygongon/items/a550bde1ed6bff5217d8>)

だそうです．



------
 - **source** ~/grad_members_20f/members/e79a93e5b7b1/posts/class/c6_20201028.org