Rubyの履歴
ALGOLの皮をかぶったLisp
1.8はインタプリタ方式だったのが、1.9からJITコンパイル方式に変わった
マニュアル
http://www.ruby-lang.org/ja/man/html/
バージョンの違いについて
なるほどわかりやすい。マイナーバージョンで安定性全然違うのが最近の言語の流行りなんだろか
6 :デフォルトの名無しさん:2009/12/05(土) 14:25:32
バージョンに関するよくある質問
- Ruby 1.8.5
レンタルサーバ等にいまだに残ってる非安定な古いバージョン
1.8.6 にすらなってない理由はたぶん管理の手抜きなので怒ってよい
- Ruby 1.8.6
過去の長期政権と数の暴力で一大勢力圏を維持中の旧安定版
公開スクリプトはこれでも動作するべきではあるんだがそろそろ 1.8.7 に譲ってくれ
- Ruby 1.8.7
1.9 シリーズの機能をいくつか足したハイブリッドなバージョン、初学者にこそお勧め
1.9 系機能は 1.8.6 では動かないが「えーマジ1.8.6!? 1.8.6が許されるのは小(AA略」と煽ってよい
- Ruby 1.9.0
不安定にして先鋭機能が超満載の開発版バージョンだったもの
1.9.x は本来全てが開発版の呼称だったのだが、事情が変わって(ここ笑うところ)1.9.1 は安定板に
- Ruby 1.9.1
満を持して登場の 1.9 系列安定板(本体は 1.8.6 程度には使えるということになっている)
本体と添付ライブラリの動作は問題がないのだが外部第三者ライブラリが全く追いついていない
初心者を脱した人が外部ライブラリの開発コミュニティに参加してくれたりすることを期待中
1.8.7は違うらしい
俺も1.8.7は1.9.1すべきだと思ったよ。1.8.6→1.8.7で劇的に変わった感じ。1.8系は1.8.5あたりからpatchlevelが登場してごちゃごちゃしてきた印象。teenyが10未満という制限のための苦肉の策なんだけど…。
1.8.7→1.8.8は1.8.6→1.8.7ほど変わらない予感がするから1.9.2あたりが理想だろうか。「1.10」はそのままバージョン文字列比較できなくなるからまずい。
そうなると現在の1.9.1は2.0.1、まだ見ぬ2.0は3.0とか4.0でいいんじゃないか。なぜ2.0にこだわるのか俺にもよくわからない。
インストール
Windowsのインストーラ
http://rubyinstaller.rubyforge.org/wiki/wiki.pl
gemとかも入る
PHP -> Ruby
Rails for PHP Developers
http://railsforphp.com/reference
http://www.marusankakusikaku.jp/archives/2007/06/23-php-perl...
http://arika.org/doc/php-ruby
http://rsthree.com/2006/12/02/ruby-for-php-programmers/
http://aligach.net/diary/20050829.html
その他
スクレイピングライブラリ
gem install hpricot
http://mono.kmc.gr.jp/~yhara/rubyscraping/?Hpricot
privateとprotected
privateの意味は、メソッドを関数形式でだけ呼び出せるようにし、 レシーバー形式では呼び出せないようにするという意味です。
class Foo
def test
print "hello\n"
end
private :test
end
レシーバ?コンテキストのことかな?ようするにprivateは定義内でしか呼び出せないということか。
protectedにするとレシーバーを指定できる。これは同じクラスであれば外からでも呼び出しが可能になることを意味する。
Rubyでは、C++やJavaのprivateと異なり、サブクラスからでもスーパークラスのprivateメソッドを呼ぶことができる。
Rubyにおけるprotectedとprivateの違いは、レシーバが付けられるかどうかであり、サブクラスから呼べるかどうかではない。
privateメソッドにはレシーバを付けられないので、同じクラスの別のインスタンスのprivateメソッドは呼べない。このような場合にprotectedを使用する。
arrayかどうかチェックする
obj.instance_of?(Array) obj.class == "Array"
レイジーロード
validation.rbにこんなのがあった
# Returns the Errors object that holds all information about attribute error messages. def errors @errors ||= Errors.new(self) end
irb(main):029:0> class Moge irb(main):030:1> @@moge = nil irb(main):031:1> def self.get irb(main):032:2> @@moge ||= Moge.new irb(main):033:2> end irb(main):034:1> end => nil irb(main):035:0> Moge.get() => #<Moge:0x1003a3418> irb(main):036:0> Moge.get() => #<Moge:0x1003a3418>
なるほど、いいね。
文字コード変換
require 'kconv' str.toeuc str.tosjis str.toutf8
http://jp.rubyist.net/magazine/?0009-BundledLibraries
PHPのcall_user_func
Object.method(:method_name).call(args)
http://www.ruby-lang.org/ja/man/html/Method.html
ファイルに書き込む
File.open(filename, 'w'){|f| f.puts hogehoge }
http://www.namaraii.com/rubytips/?%A5%D5%A5%A1%A5%A4%A5%EB%A...
PHPのdate('YmdHis")
Time.new.strftime("%Y%m%d%H%M%S")
置換
rubyは改行コード問わず、\nらしい
str.gsub(/\n+/, "\n")
マッチして配列
ary = str.scan(/ /)
文字コード指定して実行
Shift_JIS: ruby -Ks
new
Klass.new
- コンストラクタはinitialize
型チェック
obj.kind_of?(type)
inject
合計を求める
[0..10].inject(0){|sum, v| sum += v }
Array(find_all) To Hash
これでいいんだろうか。Hashは基本的にシンボルで格納すべきなんだろうか。
hash = self.find(:all).inject({}){ |result, item| result[item.id] = item.name result # return }
Test::Unit
http://www.ruby-lang.org/ja/man/html/Test_Unit.html
assert_equalsではなく、assert_equal
その他メモ
- ブロックを抜けるのはreturnではなくてnext。returnだとメソッド終了してしまう
http://www.okisoft.co.jp/esc/ruby/tut-06.html
頻出クラス
Hash
http://www.ruby-lang.org/ja/man/html/Hash.html
Enumerable
http://www.ruby-lang.org/ja/man/html/Enumerable.html
Array
http://www.ruby-lang.org/ja/man/html/Array.html