チャート式Ruby-I(puts)

\![Mac OS X-10.15.7](<https://img.shields.io/badge/MacOSX-10.15.7-brightgreen>) \![ruby-2.7.1p83](<https://img.shields.io/badge/ruby-2.7.1p83-brightgreen>) 


# イントロ

[チャート式Ruby](https://qiita.com/daddygongon/items/6f38d9a04e127a7952a7)の1回目，お馴染みの"Hello world!"です．


## 目的

Shell, Emacs, Rubyを一度に覚えてもらいます．Rubyという言語がShellという環境でどれだけ有益かを実感してもらうためです．また，EmacsとShellのkey bindingの統一性を知ることで，達人プログラマの作業効率がなぜ良いかをわかってもらうためです．


## 作業手順

このテキストの構成は

-   お題
-   簡単な解説
-   詳しい解法
-   類題

となっています．それぞれの記述に従って作業を進めれば，その内容が理解できるはずです．

ここで，忘れないための工夫をしてください．

-   参照しやすいように同じ構成
-   題目に内容をわかりやく説明した文言をつける
-   詳しい解法はくどいかもしれませんが，テスト駆動を意識しています
-   自分で作った解答をincludeして自分のできを評価してください
-   わからない内容や単語は自分で調べてテキストに書き加えるようにしてください．
-   翌週にformatしてqiitaに出力しましょう．それで独自のテキストが出来上がります．


## 内容のformatについて

このテキストでは，Shellでの入力とsource codeをEmacsとかで打ち込むのを区別しています．

    > cat hello.rb

こういう感じで，command prompt(>)をつけているのはShell入力を意図しています．その出力は普通plain textですが，

```ruby:hello.rb
puts "Hello world."
```

という感じで，Rubyのsource codeみたいに出力させています．


# puts hello\_world


## お題

まずはhello\_worldですね．

    Hello world.

と打ち出すプログラムを作ります．


## 解説

Rubyで `String` を打ち出すのにはいくつかの方法があります．どれを使ってもいいですし，Rubyistは状況に応じて全てを使います．

| method | 使用状況                            |
|:-------|:------------------------------------|
| print  | 普通に使う．要改行                  |
| puts   | 次に普通に使う. 自動改行            |
| p      | codingの最中にdebugがわりに打ち出すとき|
| pp     | pのpretty print, require 'pp'が必要 |
| printf | cのがあります．formatを整えるときに便利|

そのほかにもいくつもありますが，まずはこれを覚えましょう．

`String` はシングルコーテーション `'` で囲うのと，ダブル `"` で囲うのの二種類があります．シングルは中身をいじらないとき，ダブルはちょこちょこいじるときです．


## 詳しい解法

まずはシングルで囲って，

```ruby
puts 'hello world'
```

を試しましょう．

    > mkdir code
    > cd code
    > emacs puts_hello_world.rb

としてEmacsを開いてcodeを打ち込んでください．c-x c-sでsaveしたらc-zで一時中断して，

    > ruby puts_hello_world.rb

として走らせて見てください．動いた？

```ruby:puts_hello_world.rb
puts 'hello world'
```


## 類題

pとかprintとかも試して見てください．違いを観察して，#でコメントをつけてp\_print\_hello\_world.rbに書きなさい．

```ruby

# start here for p and pp
p
pp

```


# getsなんだけど，ARGV[0]で行きます！


## お題

    ruby hello_name.rb Rudy

と打ち込んだ時に，

    Hello Rudy.

と返ってくるcodeを書け．


## 簡単な解説

`puts` したら普通次は `gets` なんですが，目的の一つであるShell環境では，command line interfaceで作業をするためにARGV[0]というのを使って行きます．

```ruby
puts ARGV[0]
```

とhello\_name.rbに打ち込んで，

    > ruby hello_name.rb Rudy

としてください．どうよ? うちの愛犬の名前は出たやろか？

```ruby:hello_name.rb
puts ARGV[0]
```

`ARGV[0]` というのは引数配列(たぶんargument vectorの略)の0番目を意味しています．UNIX Shell上ではcommandにoption引数を直接渡すのが普通です．そのために `ARGV` が用意されています．

次に `"Hello Rudy."` と打ち出させることをかんがえます．これをするにはいくつかの方法があります．これもいろいろ試して見てください．

| puts  | puts "Hello " + ARGV[0]         |
|:------|:--------------------------------|
| puts  | puts "Hello #{ARGV[0]}"         |
| print | print "Hello #{ARGV[0]}\n"      |
| print | print "Hello " + ARGV[0] + "\n" |

Cからの人は， `printf` もありです．

```ruby
printf("Hello %s.\n", ARGV[0])
```

でも慣れてくると冗長なんで使わなくなります．多分使うのは，数値計算の出力formatを揃えたいときぐらいでしょうね．

あ． `printf` の中身は，この頃多用するようになってきました．

```ruby
print "Hello %10s. You were adapted on %s.\n" % ['Rudy', '03/21/19']
```

なんていう使い方でformatが揃えられるようになったんで．


## 詳しい解法

まずは動作させて見ます．

    > ruby hello_name.rb Rudy
    Rudy

って返ってます？　これを変更します．

    > ps

でEmacsが今どういう状態(process status)かを確認して，`fg` (fore ground)で復帰するか，`emacs hello_name.rb` で新たなEmacsプロセスを起動します．

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

がこういう状況ではよく使われます．ちゃんとでています？


## 類題

次に"Hello Rudy."という出力を保存することを考えます．

    ruby hello_name.rb bob > hello_name.txt

としてhello\_name.txtに自分への挨拶を出力させて見てください．

<div class="text" id="orgaea0484">
<p>
Hello bob.
</p>

</div>

とかね．`>` は，出力先を指定したファイル(ここではhello\_name.txt)に変更(re-direct)するShellの機能です．

    cat hello_name.txt

で中身をcat(con-cat-inate)できます．


# ここで習った項目

Ruby言語，テキストエディターEmacs, コーディング環境Shellを一度に使ってきました．同じTerminal上での操作ですが，今何に向かって操作しているかを意識して覚えていくようにしてください．「英語の命令command」というのは同じです．

-   Ruby
    -   `puts`, `print`, `p`, `pp`
    -   `ARGV[0]`
-   Emacs
    -   C-z, C-x C-s, C-x C-c
    -   `ps` : process status
    -   `fg` : fore ground, 一度中断したprocessを再度起動させる
-   Shell
    -   `mkdir`, `cd`
    -   `cat`
    -   `>` (redirection)



------
 - **source** ~/git_hub/ruby_docs/chart_style_ruby/c1_puts_hello.org