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

3月になりました

3月になりました。最近、みなさんからトラックバックやコメントをいただくことが少しずつ多くなってきました。ありがとうございます。みなさんからの情報や励ましはとてもありがたいです。今後ともよろしくお願いいたします。ぺこり。 March winds and April…

FileTest

RubyのFileTestを使うと、ファイルを検査できます。たとえば、exist? で存在のチェックができます。Perlの-eのようなものですね。 def rubyco(f) if FileTest.exist? f puts "#{f}: exists" else puts "#{f}: does not exist" end end rubyco "not-found" ru…

callcc

callcc (call-with-current-continuation)を動かしてみます。callccがsetjmp, callがlongjmpのようなものと考えるとわかりやすいですね。Continuationを使うと、明示的なループ構造が消えるのもおもしろいです。 $producer = $consumer = nil def produce k …

FileTest.file?

FileTest.file?でファイルかどうかがわかります。 def file_exist?(f) FileTest.exist?(f) && FileTest.file?(f) end p file_exist?(".") #=> false p file_exist?("..") #=> false p file_exist?("a.rb") #=> true p file_exist?("not-found") #=> false疑…

FileUtils.chmod, FileTest.writable?

FileUtils.chmodでchmodできます。FileTest.writable?で書き込み可能かどうかがわかります。 require 'fileutils' def rubyco(name, mod) open(name, "w") do |f| f.puts(name) end FileUtils.chmod(mod, name) end rubyco("writable", 0666) rubyco("non-wr…

Arrayもオブジェクト

Java同様、Arrayもオブジェクトです。変数はオブジェクトではありません。 a = Array.new a[0] = 123 b = a a = nil p b[0] #=> 123

代入はメソッド呼び出しではない

変数はオブジェクトではなく、(通常の)代入はメソッド呼び出しではありません。つまり=というメソッドは定義できないはずです。配列への要素の代入[]=はメソッドとして定義できます。 def ==(x) end def []=(x) end def =(x) #=> parse error, unexpected …

Object#freeze

freezeメソッドを使うと、オブジェクトの状態が変更されたときに例外を投げるようにできます。 s = "123" s.succ! p s #=> "124" s.freeze s.succ! #=> in `succ!': can't modify frozen string (TypeError) p s自分で作ったクラスに対しても、破壊的なメソ…

Dir.pwdと-Cオプション

Dir.pwdはカレントディレクトリを返します。起動時のオプション-Cは実行前に移動するディレクトリを指定します。 C:\work> copy con c:\tmp\test.rb puts Dir.pwd ^Z 1 個のファイルをコピーしました。 C:\work> ruby -CC:\tmp test.rb C:/tmp

BEGIN { ... }と END { ... }

BEGIN文は最初に実行され、END文は最後に実行されます。 END { puts "END" } puts "MIDDLE" BEGIN { puts "BEGIN" } __END__ BEGIN MIDDLE ENDBEGINの後にはdo ... endではなく { ... }を書かなければならないようですね。(参照:疑似BNFによるRubyの文法) BE…

クラス定義文の値

クラス定義文class ... endも値を持つようです。最後に評価された値のようですね。 a = class Rubyco def hello "Hello" end 123 end p a #=> 123疑問:あれ?Rubyリファレンスマニュアル - 実行では、「クラス定義文の評価値を得ることはできません。」とな…

スーパークラスのすげ替え

クラス定義で、スーパークラスの「すげ替え」はできません。 class Rubyco def hello "Hello" end end class String < Rubyco #=> superclass mismatch for class String (TypeError) end

予約語

予約語でも、メソッドであることが明らかならメソッドにできます。 class Rubyco def BEGIN; self; end def class; self; end def ensure; self; end def nil; self; end def self; self; end def when; self; end def END; self; end def def; self; end de…

文字列リテラル中の改行

スクリプトがCR LFの改行になっていても、文字列リテラル中の改行は常に\nになります。 class String def hexdump self.each_byte do |b| printf("%02X ", b) end print "\n" end end "012".hexdump #=> 30 31 32 "ABC".hexdump #=> 41 42 43 "012 ABC".hexd…

文字列リテラルクイズ

Rubyで以下のスクリプトを実行したら何が表示されるでしょうか。実行すればすぐにわかるので、特に答えは書きません。 p " #{ " p " " } " } " # } "