2011/10/05

Enumerator

プログラミング言語 Rubyより

Ruby 1.8でEnumeratorを使うには、require 'enumerator'が必要だが、Ruby 1.9(及び1.8.7)ではEnumeratorは組み込み済みなので、requireは不要である。

プログラミング言語 Ruby 第2版 140ページ Enumerator

2011/09/21

クラスインスタンス変数

クラスインスタンス変数

使いたくなったのでメモ。それにしてもsmalltalkって多言語使いの口から妙に出てくる気がします。

2011/08/20

文の終了はどう判断されるか?

a = 1
if a != 1
  puts "if"
elsif
  nil
  puts "elsif"
end
elseと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 上で Net::HTTP.version_1_1 と書くと、Net::HTTP の バージョン 1.1 の内部メソッドが使用されるように切り替わる

現行の ruby 1.8 と ruby 1.9 において、Net::HTTP.version_1_2 を起動させる必要はまったくない
まあ、誰も解説しないのも良くないんだけど、誰もソース読まないのも正直どうかと思う

Ruby 初心者スレッド Part 45
なんだろうと思ってたんですよね。 なるほど。

2011/08/07

Rubyの組み込み例外クラスを調べる

Rubyの組み込み例外クラスを調べる @ Kwappa研究開発室
こういうことができるのが面白いなぁ。
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

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メソッドを呼び出す

rubyではメソッドをprivateにするということは、可視性をなくすという意味ではない。__send__を使って呼び出したりもできるが、メソッドをテストするときにはこんな方法も使える。

2011/07/09

Rubyでクラスメソッドをprivateにする正しい方法

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ツールで切り替える方法

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 ―― 手続きを抽象化する二つの機能

Fiber と Proc ―― 手続きを抽象化する二つの機能
おぉぉぉぉ!
ネットワーク処理をするメソッドがあって、どうすればうまくメインの処理・ディレイ・処理回数の3つをうまく分離するかわからなかったのですが、これは美しい。Fiberを使ってコルーチンの考え方を導入すれば解決したんですねぇ…。Herokuも1.9使えるし、1.9に移ろうかなぁ。うーん…。

その他のFiberの例:
Ruby勉強会@関西でFiberについて勉強してきた
Fiberを使いやすくする仕掛け

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って、大規模システムに使えるのかなぁという懸念は、勉強していて頭のどこかにあります(実際使われてるんですが)。で、型チェックのサンプルを公開してくれてる人をハッケソ。こうやって見ると、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"

2011/05/17

正規表現メモ その1 時分秒の分割

時分秒をパースする正規表現。
/(\d{1,2}):(\d\d):(\d\d)/
1桁 or 2桁って書き方忘れちゃうんだよねぇ...。(参考)

クラスツリー

どうしても公式でRubyのクラスツリーを見つけられなかったのでメモ。図5です。