2006-11-21から1日間の記事一覧

self.メソッド

「self.メソッド」と「メソッド」という式は等価ではありません。プライベートメソッドの場合、「self.メソッド」の形式(レシーバ.メソッドの形式)では呼び出せないからです。 puts "Rubyco" #=> Rubyco self.puts "Rubyco" #=> private method `puts' cal…

一番外側のself

一番外側(トップレベル)のselfは何でしょう。 p self #=> main p self.class #=> Object同じことを今年の2月にも考えていました。

putsはどこで定義されているか

putsはどこで定義されているのでしょう。 表示してみればすぐ分かります。ObjectクラスがインクルードしているKernelモジュールで定義されているようです。 p method(:puts) #=> #<Method: Object(Kernel)#puts>クラスで定義されているのか、モジュールで定義されているのかを区別するのは</method:>…

配列の添字

コンマを使って[初めの要素,長さ]と書けるとは知りませんでした。 a = [ 'A', 'B', 'C', 'D', 'E', 'F', 'G' ] p a[1] #=> "B" p a[1, 4] #=> ["B", "C", "D", "E"] p a[1..3] #=> ["B", "C", "D"] p a[1...3] #=> ["B", "C"]

配列への代入

配列への代入の際、添字が範囲になっていると、その範囲が置換されます。つまり、添字の範囲がいったん削除され、その位置に要素が挿入されます。 添字が範囲になっているときにnilを代入すると単なる削除になります。a[0]へnilを代入したときと、a[0..0]へn…

配列の和と積

和(|)や積(&)を使うと、重複要素を簡単に削除できますね。 a = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5, 8] p a #=> [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5, 8] a |= a p a #=> [3, 1, 4, 5, 9, 2, 6, 8] b = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5, 8] p b #=> [3, 1, 4,…

joinメソッド

joinメソッドは、joinします。 p ["Alice", "Bobby", "Chris", "David"].join(',') #=> "Alice,Bobby,Chris,David"

Fixnum→Floatへ

簡単な計算をしてみます。 price = 2000 p price #=> 2000 p price * 0.9 #=> 1800.0 price = 10000 p price #=> 10000 discount_price = price * 0.9 p discount_price #=> 9000.010000に0.9を掛けると9000ではなく、9000.0になります。両者の違いを.class…

Stringの和

String + StringはStringです。 p "123" + "456" #=> "123456" p "123".to_i + "456".to_i #=> 579

16進数表

0〜255の16進数表です。 (0..15).each do |high| (0..15).each do |low| printf("%X%X ", high, low) end puts end実行結果です。 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 26 …

メソッドがどこで定義されているか

putsはどこで定義されているかを踏まえて、メソッドがどこで定義されているかを無理矢理求めてみます。 class Method def where to_s =~ /#<Method: (\w+)(\((\w+)\))?#/ if $3 return $3 else return $1 end end end module Rubymod def m end end class Rubyco include Rubymod def c end end r = Rubyco.new p r.method(:m).where #=> "Rubymod" p r.method(:c).where #…</method:>