2006-03-01から1日間の記事一覧
3月になりました。最近、みなさんからトラックバックやコメントをいただくことが少しずつ多くなってきました。ありがとうございます。みなさんからの情報や励ましはとてもありがたいです。今後ともよろしくお願いいたします。ぺこり。 March winds and April…
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 (call-with-current-continuation)を動かしてみます。callccがsetjmp, callがlongjmpのようなものと考えるとわかりやすいですね。Continuationを使うと、明示的なループ構造が消えるのもおもしろいです。 $producer = $consumer = nil def produce k …
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で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…
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 …
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は実行前に移動するディレクトリを指定します。 C:\work> copy con c:\tmp\test.rb puts Dir.pwd ^Z 1 個のファイルをコピーしました。 C:\work> ruby -CC:\tmp test.rb C:/tmp
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 " " } " } " # } "