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のいいところとそうじゃないところを色々見た感じです。
書きやすい、色々書ける、楽しそうだけれど、
読みにくそう。
ソースは読むことも多いので、読みやすい方がいいですよね。

2012年10月30日火曜日

2日目:Rubyの不思議な記法たち。

Ruby勉強二日目です。今日も初めてのRubyを読んでます。今日はP98まで読みました。
     

で、勉強したこと。
・ブロックパラメータ
何この縦棒???それがJavaにはない書き方、|変数| をブロックパラメータというそうです。
どうやって使うかというと、コールバック的な使い方だそう。

def func
  puts yield(1, 1);
end
func do |a,b|
  a-b;
end
func do |a,b|
  a+b
end


do〜endを処理のブロック化できるのは機能勉強した内容ですが、その処理ブロックが呼び出し元(上の例だと、funcという関数の中のyield)から値を受け取るために、ブロックパラメータを用意しとく、というモノ。Javaダイスキっ子の私にはアンマリ馴染みのない書き方だけれど、JavaScriptダイスキっ子でもある私は、JavaScriptに変換して、以下の様に理解。



function func(callback){
 console.log(callback(1, 1));
}
func(function(a,b){return a+b});
func(function(a,b){return a-b});


。。。JavaScriptの方が、わかりやすくね???
(カッコ)、{カギカッコ}、ダイスキ。


・ダブルコロンは . と同じ意味。
Math::log(1)
は
Math.log(1)
と同じ意味。私はドットを使うよ。ただし、定数は::を使わないといけないそうです。

・'文字列'と"文字列"は同じ意味。
私は、"文字列"を使うよ。

・<<は配列の最後に追加、という意味。
args = ["a","b","c","d"]
args << "e"
ってやると、argsは、a,b,c,d,eになる。コレは便利。

・文字列中に#{}って入れると、カッコの中が式展開される!
"一足す一は#{1+1}" ってやると「一足す一は2」って展開される。便利。

・%記法
RubyとJavaの一番の違いは、文字列の扱い方のように感じています。その中の一つ、%記法。
%q[test]
とか書ける。[]は英数字じゃなければ何でもいいラシイ。
文字列を生成するために、%コマンド[文字列]のようにかけて、コマンドによって文字列に縛りをつけられるようです。
でも、私、使わないよ。

・バッククオート ` でくくると、コマンドライン実行
え~~~~!危なくね?
ret = `rm -rf /`
って書くと、rm -rf / がコマンドラインとして実行される。私はバッククオートは使わない。

・ヒアドキュメント
コレはちょっと便利。文字列を複数行に書けます。
word = <<EOS
 文字列を
 複数行に
 書けますよ!
EOS
<<終わりの文字〜終わりの文字みたいな記法。
最後の終わりの文字の前にインデントを付けたい場合は、<<-終わりの文字〜終わりの文字、のように、-を付ける。

・文字列 % 値 で、 printf的な使い方ができる。
これも、Javaにはない記法。
"一は数字で%f" % 1 は 一は数字で1となります。

・?文字は一文字ストリング。
これ、何のためにあるんだろう。 ?あ は "あ" と同じ意味だそうです。
私は、"あ"って書きます。

・=~で正規表現マッチング
ニョロって、Javaでは使いませんよねー。
正規表現は。。。Javaでもアンマリ使わなかったので、別途勉強するとして、イコールニョロは正規表現と覚えておきます。

・配列にマイナス指定で、後ろからマイナス個目の要素を出力できる。
args = ["a","b","c","d","e"]
args[-1]はeが出ます。コレも便利!後ろは1インデントなのね。

・文字列が乗算できる!
"a" * 3 は "aaa" です。オモシロイけれど、使うのかな、コレ。

・:symbol => "value" は symbol : "value"と書ける。
=>はハッシュのキーと値を結びつけて入れられるもの、というのは昨日勉強しましたが、
シンボル使うと、更に省略できる。
hash1 = [:symb1=>"val1", :symb2=>"val2", :symb3=>"val3"]
hash2 = [symb1:"val1", symb2:"val2", symb3:"val3"]
的な。

・$が頭につく変数はグローバル変数。
・$KCODEで、Rubyの内部エンコードを指定できる。
まぁ、僕、UTF-8使う。

・ソースコード中の冒頭の -*- coding: utf-8 -*- は内部エンコード指定。マジックコメントというらしい。

・Object.dupでオブジェクトのクローン。

うん。Ruby読んでてよく分からなかった部分が、だんだんわかってきた気がします。

2012年10月29日月曜日

1日目:Ruby勉強はじめ。

さて、ワタクシ、生粋のJavaプログラマです。静的型付けダイスキ!コンパイルダイスキ!

しかしながら、仕事でRubyをやることになり、今は嫌々Rubyの勉強中です。
Ruby、好きになるかな。。。。

というわけで、Rubyの勉強を始めます。
ゴールはRuby on Railsでアプリを作ること、と定めます。

さて、勉強一日目。先ずは教科書選びです。
近くの本屋に寄って来ましたよ!Ruby関係の本は一冊でしたよ!

と、いうわけで、初めてのRubyでRubyを始めてみます!

さて、一日目はp31まで読んでみました。覚書メモ。
・Rubyは処理をブロック化できる。
3.times do
 puts "hello"
end
は、3.timesというメソッドに puts "hello"という処理を渡して処理する。だから3回 helloが出力される。
・do-endブロック≒{ }
上記例は
3.times {
 puts "hello"
}
と同じ意味。
・:hogehogeはJavaのEnumっぽいもの。hogehogeという値を定義するモノ。
・関数呼び出しの()は省略できる。
puts ("hello")
は、
puts "hello"
と同じ。コレ、Javaダイスキ人間にはすごく違和感がある。。。
・=>はハッシュへのキーを指定した代入。
aArray={:pank=>"Crash", :rock=>"RHCP"}
で、aArrayに、キー:pankで、"Clash"が、キー:rockで"RHCP"が代入される。

さて!ガンバって勉強していきます!