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

Object#to_s

Rubyのputsは、オブジェクトの文字列表現を得るto_sを暗黙のうちに使います。 JavaのtoString, Perlのas_string(決まってないけど), C#のToStringのようなものですね。 疑問: Object#to_sとObject#to_strの違いは何でしょうね…→nunaさんから、[ruby-list:217…

Binary trees

Knuth先生の本に書かれている二分木を生成するアルゴリズムを、Rubyでコーディングしました。 k番目のノードの、左側のノード番号がl[k]、右側のノード番号がr[k]で表します。0はexternal nodeを表します。 Visitしている感じをyieldで表現してみました♪ # F…

getopts -> OptionParser

Rubyでコマンドラインオプションを取り扱うにはどうするのか、調べようと思いました。 (たしかgetoptsという関数があったはず…) > refe getopts not match: getopts(あれれ?違ったかしらん。) > refe opt OpenSSL::SSL::SSLContext#options OpenSSL::SS…

ObjectSpace

ObjectSpace.each_objectを使うと、特定のクラスの全オブジェクトをイテレートできます。 class Rubyco def hello puts "hello:#{self}" end end Rubyco.new ObjectSpace.each_object(Rubyco) do |o| o.hello end GC.start ObjectSpace.each_object(Rubyco) …

nil.to_a, nil.to_s

nil.to_aは空の配列、nil.to_sは空の文字列です("nil"ではありません)。 p nil.to_a #=> [] p nil.to_s #=> ""

ローカル変数

ローカル変数lvarが見えるようになるのは、構文解析時にはじめての代入が見つかった箇所よりも後ですが、lvarが未定義であるというエラーが出るのは実行時です。 構文解析時に代入が見つからなければならないので、evalで間接的に実行しても駄目です。パーザ…

attr_reader

attr_readerというメソッドを使うと、インスタンス変数から自動的にgetterが作れます。 class Point attr_reader :x, :y def initialize(x, y) @x = x @y = y end def to_s "(#{@x}, #{@y})" end end a = Point.new(123, 456) puts a #=> (123, 456) puts a.…

attr_accessor

attr_accessorというメソッドを使うと、インスタンス変数から自動的にアクセサ(getterとsetter)が作れます。 class Point attr_accessor :x, :y def initialize(x, y) @x = x @y = y end def to_s "(#{@x}, #{@y})" end end a = Point.new(123, 456) puts a …

空の式()の値

空の式の値はnilです。 def nil.hello puts "Hello" end ().hello #=> Hello puts(().class) #=> NilClass if ().nil? puts "Yes" #=> Yes end

真理値表

Rubyで真理値表を作ってみました。とてもわかりにくく…(^_^; line = lambda { |asis, x, y| [ "x", "y", "!x", "!y", "x && y", "x || y", "x ^ y", "!x || y", ].each { |s| printf("%-8s", asis ? s : eval(s)) } puts } line.call(true, nil, nil) [false…

単項演算子+, -

単項演算子+, -をメソッド定義する場合には、それぞれ+@, -@という表記をします。 以下はジョークです。 class String def +@ "positive #{self}" end def -@ "negative #{self}" end def -(s) "#{self} minus #{s}" end def +(s) "#{self} plus #{s}" end e…

ARGF.filename

ARGFはコマンドラインで指定されたファイルを仮想的に連結したファイルですが、ARGF.filenameは実際の現在のファイル名になります。 while line = ARGF.gets print "#{ARGF.filename} > #{line}" end実行結果です。 >ruby a.rb file*.rb file1.rb > (1..10).…

alias

メソッド名をaliasすると、メソッドに別名をつけることができます。別名といっても定義をシェアしているわけではないようです。元のメソッドを再定義しても、別名の側の定義は変わらないからです。元のメソッドと同じ定義を持つ別のメソッドが作られる…と考…