- プログラミング言語 Rubyより
Ruby 1.8でEnumeratorを使うには、require 'enumerator'が必要だが、Ruby 1.9(及び1.8.7)ではEnumeratorは組み込み済みなので、requireは不要である。
- プログラミング言語 Ruby 第2版 140ページ Enumerator
2011/10/05
Enumerator
2011/09/21
2011/09/14
2011/08/27
2011/08/20
文の終了はどう判断されるか?
a = 1 if a != 1 puts "if" elsif nil puts "elsif" endelseとelsifをtypoしてしまい、はまりました。上記のソースでは何も出力されません。「文が終了していないことがわかると、Rubyは自動的に次行まで読む」というやつでしょうか?
2011/08/09
Net::HTTP.version_1_2は何をしているのか
- Ruby 初心者スレッド Part 45より
Net::HTTP の バージョン 1.1 ってのは、太古の昔の ruby 1.6 と呼ばれるものに付属してたやつ
Net::HTTP の バージョン 1.2 は、ruby 1.8 と 1.9 以降の現行に付属してるやつruby 1.6 上で Net::HTTP.version_1_2 と書くと、Net::HTTP の バージョン 1.2 の内部メソッドが使用されるように切り替わる
現行の ruby 1.8 と ruby 1.9 において、Net::HTTP.version_1_2 を起動させる必要はまったくない
ruby 1.8 上で Net::HTTP.version_1_1 と書くと、Net::HTTP の バージョン 1.1 の内部メソッドが使用されるように切り替わる
まあ、誰も解説しないのも良くないんだけど、誰もソース読まないのも正直どうかと思う- Ruby 初心者スレッド Part 45
2011/08/07
Rubyの組み込み例外クラスを調べる
こういうことができるのが面白いなぁ。
puts Object.constants.find_all {|c| (cc = Object.const_get(c)) && cc.respond_to?(:ancestors) && cc.ancestors.include?(StandardError) }.sort
2012/01/02: 個人的にはStandardErrorを親クラスに持つより、Exceptionを親クラスに持つものを調べたほうが便利っすね。
2011/07/25
メールアドレスかどうか
valid_chars = '[0-9A-Za-z_!#\$%&*+\-\/=\?^_{|}\~\.]+' valid_pattern = Regexp.new("^(#{valid_chars})@(#{valid_chars})$", nil, 'n')
Rubyでメールアドレスかどうか調べたくなってみた @ たくまけい
2011/07/24
浮動小数点数にマッチする正規表現
$re_float = /[-+]?(?:[0-9]+(\.[0-9]*)?|(\.[0-9]+))([eE][-+]?[0-9]+)?/ p $re_float =~ "1.23" # => 0 p $&.to_f # => 1.23 p $re_float =~ ".23" # => 0 p $&.to_f # => 0.23 p $re_float =~ "1.23e1" # => 0 p $&.to_f # => 12.3 p $re_float =~ "1.23e-1" # => 0 p $&.to_f # => 0.123@ Rubyリファレンス
2011/07/11
privateメソッドを呼び出す
2011/07/09
Rubyでクラスメソッドをprivateにする正しい方法
C++から来た人は( ゚д゚)ポカーンなんじゃないでしょうか。
2013/06/24 追記:
privateメソッドを呼ぶときにはselfは使えずに暗黙で呼ぶ(ここのリスト13)というのも結構( ゚д゚)ポカーン
2011/07/07
クラス変数は直感に反する(1.8)
Ruby1.8のクラス変数は継承されてしまうようです(1.9ではされないように変更)。
一般的に(?)クラス変数という言葉から類推される挙動を求める場合は、クラスインスタンス変数を使います。「クラスのインスタンス変数」と「クラスインスタンス変数」は別物であることに注意。ややこしー。
逆にクラスインスタンス変数を使うと継承で初期化されないというデメリットがある。その場合は次のようにして初期化することができる。
class C @var = 1 class << self attr_accessor :var def inherited(klass) klass.var ||= var super end end def disp self.class.var end end class D < C end p D.var # => 1参考
2011/07/06
ruby1.8 / ruby1.9.1をdebianのupdate-alternativesツールで切り替える方法
便利っすー。
どうしてgemは1.9だけ登録してるのかな?と思ったのですが、update-alternatives --display gemをして納得。gem1.8はupdate-alternativesで管理されているのに、gem1.9は管理されてないんですね。なんでなんでしょう...。
追記 2013/04/11:
今はrvm使ってます。
2011/07/05
chompの区切り文字として空文字列が指定された場合
p "abc\r\n\r\n".chomp("") # => "abc"
区切り文字として空文字列が指定された場合は、行末の連続する行区切り文字を全て削除する。多人数マルチOSでテキストファイルを編集した場合、改行コードが統一されない場合が多々発生するんですよねぇ…。ツカエル。
2011/07/03
多重代入のとき、右辺を全て評価し終わってから代入を行う
んー。temporaryを作らなくていいのが便利だなぁ。
var1, var2 = "value1", "value2" var1, var2 = var2, var1 p var1 # => "value2" p var2 # => "value1"
2011/06/24
アプリケーションの速度には処理系の速度よりも組み込み関数やメソッドの性能のほうが重要
Ruby 1.9 で Web アプリを想定したベンチマークをとってみた
Ruby1.8とRuby1.9でベンチマークを取ってくれています。ボトルネックって、実測してみるとへぇーって思うところにあったりすることが多々ありますよねぇ。
2011/06/18
Fiber と Proc ―― 手続きを抽象化する二つの機能
おぉぉぉぉ!
ネットワーク処理をするメソッドがあって、どうすればうまくメインの処理・ディレイ・処理回数の3つをうまく分離するかわからなかったのですが、これは美しい。Fiberを使ってコルーチンの考え方を導入すれば解決したんですねぇ…。Herokuも1.9使えるし、1.9に移ろうかなぁ。うーん…。
その他のFiberの例:
Ruby勉強会@関西でFiberについて勉強してきた
Fiberを使いやすくする仕掛け
2011/06/15
2011/06/10
2011/06/09
2011/06/08
指定文字数での切り捨て
大量の文字出力があるコマンドラインアプリを作りました。その中の数行の出力結果が非常に長い場合、結果が見にくくてしょうがない問題に襲われました。
そこで、指定文字数だけ出力して残りを切り捨てるsnippetを追加。split(//)で1文字ずつhitさせるのが、multi-byte文字を扱うときの定石らしいですね。なんとなく実装しましたが、もっとうまい方法ないかなぁ...
def truncate(string, width) if string.length <= width string else abbr_symbol = "..." string = string[0, width - abbr_symbol.length] # Even if string consisted multi-byte characters, # number_of_character would work well. number_of_character = string.split(//).size # Last character may be broken. string = string.split(//)[0, number_of_character-1].join (string || "") + abbr_symbol end end
2011/06/23追記:
こういうときはjustified(揃える)という英単語を使うらしい。この場合だとleft_justifiedか。適切な名前がすぐに思いつくようになりたいなぁ...orz
2011/07/01追記:
String.ljustでもっと簡単に実装できる気がしてきました...。
2011/06/05
Rubyでも型チェック
Rubyって、大規模システムに使えるのかなぁという懸念は、勉強していて頭のどこかにあります(実際使われてるんですが)。で、型チェックのサンプルを公開してくれてる人をハッケソ。こうやって見ると、Rubyで型チェックって冗長ですねw悩ましい。
2011/05/30
gemspecでのファイルリスト
gemspecを勉強していて、こんな書き方もできるんやなぁと思ったのでメモ。
gemspecでは、下記のようなファイル構成をリストとして取得したい場合がある。
gemtest/その場合、次のように記述する。
gemtest/lib
gemtest/lib/gemtest.rb
gemtest/README
gemtest/gemtest.gemspec (このファイルだけ対象外)
files = Dir.glob(*lib/**/*") << "README"