2012年10月31日水曜日

3日目:そんなにいろんな書き方で来て。。。イイの?


Ruby勉強3日目!今日も
を読んでいます!
文法に入ってきて、Ruby独特の表現も増えてきました。
生粋Javaプログラマな僕にとって、新しい刺激が多い!ちょっと刺激的すぎることも。。。
さて、今日学んだことです。

・@でインスタンス変数、@@でクラス変数
変数宣言がないので異議で同名変数書くと上書きしちゃう。先生、変数宣言したいっす。Perlもこんならしいけれど。。。変数表を書かされた時代のトラウマがこのしようを生んでるのかしら。

・JavaのthisはRubyでself

・__FILE__で、今実行しているファイル名

・慣例では変数はアンダースコア区切り(user_hash)らしい。
キャメルケース(userHash)つかいたいっす。
クラス名はキャメルケースなのにね。


・シンタックスシュガー
シンタックスシュガーという言葉を初めて知りました。別の書き方もできるけれど、別に用意した簡単な書き方のこと。
驚いたのは、1+2はじつは1.+ (2)ですって!
+って、関数なんだ。オモシロイ。

・!~は正規表現のパターンマッチ演算子の否定。
見慣れないよねー。!=~にして欲しい。


・インクリメント演算子がない!
慣れ親しんだi++が書けない!
先生、インクリメント、したいっす。

・多重代入
=の両辺で同じ数の変数と値を用意しておくと、それぞれに代入される。
a,b,c=1,2,3
ってすると、a=1;b=2;c=3と同じ意味。使うかな?
ちなみに、左辺の変数の個数が少ないと右辺の値は消し飛ぶ。

・配列展開。変数の前に*ってつけると、式上で配列になる。
*a=1,2,3
a,b,c=*array
って書ける。コレは便利かも。


・論理演算子はオベラントのいずれかを返す。
arg = true || false だと、argはtrue。コレはJavaの常識。
じゃ、rubyで、
arg = 10||0
ってなんだ?argは10になる。||って、最初のtrueとなる値もしくは最後のfalseとなる値を返してくれるらしい。。。
arg = 10&&0 は逆ね。。。えー。バグ生みそうです。
比較演算子はboolean返してくれないと、if文の中にboolean型以外の変なもの入れそう。
んーーーー。


・||を使った初期化イディオム
||を使って、↓みたいに書ける。
def initFunc(message)
  #初期化処理
  p "init "+message;
  return "init now"
end
value ||=initFunc("value")
value2 = "aleady inited"
value2 ||=initFunc("value2");
こうやって書くと、init value は表示されるけれど、init value2 は表示されない。
valueに値が入っていないと、falseになるから、次のtrueを探して、initFunc("value")を実行する。上の例だと、valueは値が入っていないからfalseとなって、initFuncは実行されるけれど、value2は値が入っているからtrueとなって、次のinitFuncは実行されない。
すげー。便利そうで使いそう!

・関数の引数に初期値を書ける。
def func(param="default")
  p param
end
func("value")
func()
一行目みたいに、変数宣言時に引数の初期値を指定しておける。
で、呼び出し時にその初期値を上書きできる。
上書きしなくてイイ時は引数を省略できる。便利!

・関数呼び出しの( )は省略できる。
ええええええーーーえーーえーーえーーーーーえーーー!!!
止めて欲しい!!!処理か変数か、そこだけ読んでもわかんないってことでしょ!?

p quest
って一行あったとき、コレが何か呼び出してるのか変数を参照しているのか、わかんないってことだよね。クラスとか出てきた時、書けはするけれども、読めないソースになりそ。
。。。私は関数呼び出しには必ず( )をつけます。先生。

・ifの後の処理ブロックはthen end
Rubyのif文はこんな感じ

if true then
  p "this is out";
elsif true then
  p "this is not out"
else
  p "off course this is not out"
end
。。。先生。。。{}、書きたいです。。。。ブロック化したいっす。
あと、elsifじゃなくて、elseifって書きたいです。。。。
thenは省略可能。thenは書きたくないな!私は書かない!

・関数  if 式 と書ける。

func() if true;

読みにくくね?
しかも、処理ブロック if 式 はだめ。↓みたいには書けない。

{p "test"} if true;


・Javaのswitch-caseのかわりにcase-when 文がある。
ブレイクは必要ない。

・Integer#timeとuptoは便利
これは便利!

3.times do|i| p "val#{i}" end
とか、
0.upto(2) do|i| p "val#{i}" end
で簡単にループが書ける!イイなー。

・breakに値を付けられる。
これもなにげに便利そう。
arg = 3.times do|i|
  p "val#{i}";
  if i==2 then
    break i
  end
end

p "arg is #{arg}"
って書ける。Javaではループ前に、ループの外で変数宣言しないといけなかったんだれど、それをシンプルに書ける。

・continueはnext

・try catchはbegin rescue end
rescueの後に=>変数で値を入れられる。
こんな感じ
begin
  func()
rescue RuntimeError => e
  p e
ensure
  #closing  
end

・rescueだけでも書ける。
コッチのほうが便利かな?
func() rescue p "error! but continue"
こんなふうに書ける。

・throwはraise
本によると、RubyはExceptionじゃなくて、Errorなのかな?

・raise エラークラスでnewしなくてもエラーオブジェクトを投げられる。

begin
  raise ArgumentError
rescue ArgumentError => e
  p "ArgumentError #{e}";
end

これ、どういうこと?ArgumentError.new()じゃないの????

・catch throwはJavaとは別の用法で使われる。その名も「大域脱出」
かっけー名前!複数ループをぶちぬいて外側に出るのを「大域脱出」たいいきだっしゅつっていいます!カッケー!!

・メソッドの定義はdef。
いさらか。

・関数宣言の引数カッコも省略できる。
省略すんな。
。。。。
省略すんなよ。

・returnを省略できる。省略すると最後の値が戻る。
省略すんな。
かってに値を戻すな。





んーーーーーーーーーーーー。
今日はRubyのいいところとそうじゃないところを色々見た感じです。
書きやすい、色々書ける、楽しそうだけれど、
読みにくそう。
ソースは読むことも多いので、読みやすい方がいいですよね。

0 件のコメント:

コメントを投稿