2006-03-05から1日間の記事一覧

Array#map

RubyのArray#mapは、各要素に対してブロックを評価し、その結果を集めた配列を返します。 a = [ 0, 1, 2, 3, 4, ] b = a.map do |e| e * 2 end puts a.join(', ') #=> 0, 1, 2, 3, 4 puts b.join(', ') #=> 0, 2, 4, 6, 8

何かを継承したモジュールはない

あるクラスを継承したクラスは作れますが、あるクラスを継承したモジュールは作れません。モジュールはMix-inのためのものだからです。 class RubycoClass < String end module RubycoModule < String #=> parse error, unexpected '<' endモジュールを継承…

==, eql?, equal?

==とeql?は値が等しいかどうかを調べます。これらはクラスごとに再定義し「そのクラスにおける等しさ」の意味を決めます。数学でいう同値関係になることが期待されると想像しますが、Rubyリファレンスマニュアルにはそこまでは言及されていないようです。 eq…

ローカル変数

ローカル変数のスコープは宣言した場所から始まります。代入は宣言の一種のようです(まだ、正確には調べていません)。 x = "outer" def rubyco x = "inner" puts x end rubyco #=> inner puts x #=> outer代入が実行されなくても宣言と見なされます。これ…

擬似変数

擬似変数(__FILE__, __LINE__, false, nil, self, true)へは代入できません。 無理に代入すると文法エラーになります。したがって、以下のスクリプトではHello, ...は表示されません。 p "Hello, self = #{self}" self = nil #=> Can't change the value of …

擬似変数(2)

擬似変数に保持されているオブジェクトのクラスを調べてみましょう。 p nil.class #=> NilClass p true.class #=> TrueClass p false.class #=> FalseClass p __FILE__.class #=> String p __LINE__.class #=> Fixnum

TrueClass, FalseClass

true, falseは、それぞれTrueClass, FalseClassの唯一のインスタンスになります。おお、これこそシングルトンの価値があるシングルトンですね。シングルトンでかつイミュータブルなオブジェクトたちです。きっとTrueClass, FalseClassのインスタンスは新たに…

スペースシップ演算子

スペースシップ演算子はsortで使われます。この演算子でクラスに全順序を入れることができます。 class Person attr_reader :name, :age def initialize(name, age) @name = name @age = age end def to_s "#{@name} (#{@age})" end def <=>(o) cmp = age <=…

raise

raiseで例外を投げることができます。 newメソッドがあるのに、あたかもないかのように見せてみます。しかも怪しいコールスタックで♪ class Rubyco def self.new raise NoMethodError, "undefined method `new' for #{self}::#{self.class}", [ "rubyco.rb:3…

GDBM

GDBMのインスタンスはハッシュとして扱うことができます。キーと値は文字列でなければなりません。 require 'gdbm' GDBM.open('dbfile') do |hash| for i in (10..20) hash[i.to_s] = (i * i).to_s end end GDBM.open('dbfile') do |hash| hash.keys.sort.ea…

pp

ppを使うとプリティプリントができます。 require 'pp' a = { "Bobby" => 19, "Elvis" => 19, "Grimm" => 19, "Fredy" => 19, "Haris" => 13, "David" => 13, } b = { "Alice" => 13, "Chris" => 16, } people = [ a, b ] p people pp people実行結果です。…