「7つの言語 7つの世界」 Ruby 1日目(Jugemより移植)

Posted by johtani on Friday, September 9, 2011

目次

実に3年ぶりくらいにゆっくりできる日々が訪れたので、積読状態の本を消化しようと「7つの言語 7つの世界」を読み始めました。

せっかくブログも始めたので、備忘録も兼ねて感想などを書いていこうかと。

この本ですが、以下の7つの言語についてエッセンスがまとめられています。

  • Ruby
  • Io
  • Prolog
  • Scala
  • Erlang
  • Clojure
  • Haskell

まずはRubyからです。 ここ2年ほどRuby(Rails)に関連する仕事をしていたのですが、Ruby周りはプロフェッショナルな方たちがいたので、きちんと勉強していないことがこの本を読み始めてわかりました。

ということで、前置きはそれなりな記述ですが、感想は適当になりますので、あしからず。

感想:

irbが便利。簡単に動作確認ができるのが便利。Javaだとコンパイルが必要。 変数を定義する必要がない気軽さはある。 必ず戻り値が帰ってくる「puts ‘hello, world’」でも。=>nil putsは楽かな。まぁ、Eclipse使ってると一緒か。 「4」もオブジェクトとなっている。ここもJavaと異なる。 (x <= 4).classという記述でTrueClassというクラスだとわかる。 unlessが結構便利。ただし、記述方法が多数あるので、可読性は落ちる?場合によってはわかりやすいか? あと、括弧()がないのも慣れない。(まぁ、これは慣れの問題。ただし、カッコありでもOK) {}のかわりがif~endなのはわかりやすいかも。 if not はわかりやすくていい。!はだいたい間違えるから。。。 whileも1行形式で書けるのか。「x = x + 1 while x < 10」慣れないと厳しい。個人的には混在すると読めないなぁ。 nilとfalse以外がすべてtrueに評価されるのは厳しいのでは?型のチェックがないので、booleanが入ってると想定してない場合に挙動を読めないかも。実行時に動作が変だなーと思うことが出てきそう。 and、orの記述が使えるのは読みやすい。ただし、混在するとやっかい。 判定結果が明らかになった時点で実行が中止されるのは普通。&、|の挙動はJava同様。

やりながら疑問点:

  • NetBeansとかIDEでフォーマッタやcheckstyleみたいなのはあるのか?
  • コーディング規約はあるのか?(2日目に「習慣」があるらしいとの記載があった。)
  • 必ず戻り値が戻ってくるのは、必ずGC対象になりうるオブジェクトが生成されるってことか?

ここまでが感想と疑問点。で、この本の面白いところは最後に調査、コーディングを行う練習問題的なものがある部分です。 一応、私なりの答えを書いておこうかと。(一覧などで見えないようにはしますが、ネタバレがあるので注意してください。)

ということで、セルフスタディの回答。

(探してみよう)

○Ruby API
http://ruby-doc.org/core/
○Programming Ruby: The Pragmatic Programmer's Guideのオンライン版
http://www.ruby-doc.org/docs/ProgrammingRuby/参考資料:http://www.swlab.it.okayama-u.ac.jp/man/ruby/uguide/uguide00.html
○文字列の一部を置換するメソッド
"hello".gsub(/[aeiou]/, '*')
○Rubyの正規表現に関する情報
日本語:http://www.namaraii.com/rubytips/?%A5%D1%A5%BF%A1%BC%A5%F3%A5%DE%A5%C3%A5%C1 英語の試せるサイト(irbが動けば必要ないかもね):http://rubular.com/
○Rubyの範囲に関する情報
日本語:http://doc.okkez.net/static/192/class/Range.html 英語:RDocのRangeクラスに相当するのかな。

(試してみよう)

○文字列"Hello, world"を出力する。
```
○文字列"Hello, Ruby"の中の"Ruby"という単語のインデックスを検索する。
```

s = ‘Hello, Ruby’ s.index(‘Ruby’) //indexofで間違えた

<dt>○自分の名前を10回出力する。</dt>
<dd>```

※まずは、正統派。
i = 0
while i < 10
  puts "johtani"
  i = i + 1
end
※Rangeを利用
(1..10).each {|n| puts "johtani #{n}"}

※forもあるよね
for i in 1..10
  puts "johtani"
end

※timesってのもある。(0始まり)
10.times {|n| puts "johtani #{n}"}

※uptoなんてのもあるのか。
1.upto(10) {|n| puts "johtani #{n}"}

※downtoも
10.downto(1) {puts "johtani"}

※stepもある。
10.step(1, -1) {puts "johtani"}//step(上限,ステップ)
```</dd>
<dt>○文字列"This is sentence number 1"の1を10までカウントアップしながら10回出力する。</dt>
<dd>```

1.upto(10) {|n| puts "This is sentence number #{n}"}
※あとは上記と一緒
```</dd>
<dt>○ファイルに格納されているRubyプログラムを実行する。</dt>
<dd>```

vi hoge.rb
※#上記処理をどれか記述

 $ ruby hoge.rb
○ボーナス問題:少し物足りない人は、乱数を選択するプログラムを書いてみてほしい。プレーヤーに数字を選択してもらい、その数字が生成された乱数よりも大きいか小さいかを返す。
```

-- coding: utf-8 --

range = (1..100) while true puts “#{range.min}から#{range.max}の数字を入力してください” n = gets n = n.to_i if range.include?(n) break; else puts “範囲外の入力値です。もう一度入力してください” end end i = rand(range.max) if i < n puts “入力「#{n}」は乱数「#{i}」より大きいです” elsif i == n puts “入力「#{n}」は乱数「#{i}」と等しいです” else puts “入力「#{n}」は乱数「#{i}」より小さいです” end

</dl>

とまぁ、こんな感じ。こんな方法もあるよ、ここおかしくない?などあれば、コメント欄まで。
リアクション大募集です。
はやく、シンタックスライター導入せねば。

comments powered by Disqus

See Also by Hugo


Related by prelims-cli