2006-01-01から1ヶ月間の記事一覧

includeとMixin

RubyのMixinについて。モジュールをincludeすると、モジュール定数、クラス定数、クラス変数、インスタンスメソッドが使えるようになります。 モジュールのメソッド(RubycoModule.rubyco3)はクラスメソッド(RubycoClass.rubyco3)にはならないのですね。 modu…

タブ幅

最近、Webなどで公開されているRubyのコードもだいぶ読めるようになってきました。とてもうれしいです。 ところでRubyでのタブ幅は2が標準的なのでしょうか。Javaで4タブに慣れているせいか、2タブでendが並ぶとちょっとうっとうしく感じるのですけれど。

gets.to_i

整数を2個入力して、その和を表示します。 print "x = " x = gets.to_i print "y = " y = gets.to_i print "#{x} + #{y} = #{x + y}\n"実行例です。 x = 123 y = 4567 123 + 4567 = 4690

procとcall

Rubyでは、proc { ... }で手続きが作れ、callで手続きを呼び出せます。 p(123) # => 123 pp = proc { |x| p(x) } pp.call(123) # => 123 ppp = proc { |xx, x| xx.call(x) } ppp.call(pp,123) # => 123 pppp = proc { |xxx, xx, x| xxx.call(xx, x) } pppp.c…

open

ファイルをopenしたときにエラーが起きると例外が起きます。 begin open("xxxx", "r") {|f| while line = f.gets() print ">> #{line}" end } rescue print "#{$!}\n" endファイルxxxxがない場合の実行結果です。 No such file or directory - xxxxファイルx…

exitとSystemExit

Rubyでは、Kernel#exitを実行すると例外SystemExitが投げられますので、rescueで捕捉できます。 begin exit rescue SystemExit p $! # => #<SystemExit: exit> end</systemexit:>

riと予約語

Rubyでは、riコマンドでリファレンスを読むことができますが「その文字列が何であるか」を知らないと調べにくいことがあります。たとえば、rescueの使い方を調べようと思ってもri rescueでは駄目ですね。ri beginでは別のbeginが見つかりますし…。そういう意…

レンタルサーバ

RubyのCGIをテストするため、レンタルサーバを借りました。特に問題なく動きました。

呼び出し側のアスタリスク

メソッド呼び出しで引数に*をつけると、その内容が展開されます。 def rubyco(a, b, c, d) print "a = #{a}, b = #{b}, c = #{c}, d = #{d}\n" end a = [100, 200, 300] rubyco(0, *a) # => a = 0, b = 100, c = 200, d = 300

呼び出し側と受け取り側のアスタリスク

呼び出し側のアスタリスクは配列を展開しますが、受け取り側のアスタリスクは残りの引数を配列化します。 def rubyco(a, b, c, *d) p a p b p c p d end a = [100, 200, 300] rubyco(0, 1, *a)実行結果です。0, 1, 100, 200, 300が渡されるので、最後の200, …

ブロック付きメソッド呼び出し

以下のプログラムでdo ... endはブロックです。eachというメソッドをブロック付きで呼び出しています。 def print_them(a) a.each do |k| print "#{k} (#{k.class}), " end print "\n" end print_them([100, 200, 300]) # => 100 (Fixnum), 200 (Fixnum), 30…

yield

yieldを使ってブロックを呼び出すと、自分でeachを作ることもできます。yieldへの引数がブロックパラメータとして渡されます。 class Array def my_each for e in self yield(e) end end end def print_them(a) a.my_each {|k| print "#{k} (#{k.class}), " …

proc

proc { ... }で手続きオブジェクト(Procオブジェクト)を作ると、ブロック付きのメソッド呼び出しで手続きを別途渡すことができます。 class Array def my_each for e in self yield(e) end end end def print_them(a) myproc = proc {|k| print "#{k} (#{k.c…

to_proc

to_procメソッドがあるオブジェクトならば、手続きオブジェクトとしてメソッドに渡すことができます。to_procメソッドはProcオブジェクトを返します。 class Rubyco def to_proc return proc {|k| print "#{k} (#{k.class}), " } end end class Array def my…

lilyを読む(1)

Rubyの勉強の一環として、ブログツールlilyを少し読んでみました。 index.rb class LilyCGI WEBrick::CGIを継承 Lilyをinclude (mixin?) 2タブ lib/lily.rb module Lily Utilをinclude hashのキーを'...'で書くのと"..."で書くのが混じっているが…。 service…

ifと三項演算子

Rubyのif文は値を持ちますから、三項演算子と等価になります。 def abs1(n) if n > 0 return n else return -n end end def abs2(n) return n > 0 ? n : -n end def abs3(n) x = if n > 0 n else -n end return x end p abs1(-123) # => 123 p abs2(-123) # …

Math.sqrt

Math.sqrtで平方根が計算できます。負数を与えるとエラーです。虚数にはなりません。 p Math.sqrt(2) # => 1.4142135623731 p Math.sqrt(-1) # => in `sqrt': Domain error - sqrt (Errno::EDOM)

Complexクラス

Complexクラスで複素数が扱えます。Complex::Iが虚数単位iに相当しますが、Complex(0, 1)とequal?ではありません。なぜでしょうね。 require "complex" p Complex(0, 1) # => Complex(0, 1) p Complex::I # => Complex(0, 1) if Complex(0, 1).equal?(Comple…

Rationalクラス

Rationalクラスで有理数が扱えます。Rational(分子, 分母)で有理数。分母を省略すると整数になります。 require "rational" def harmony(n) sum = Rational(0) for k in 1..n sum += Rational(1, k) end return sum end for n in 1..20 r = harmony(n) print…

コロンとピリオド

Rubyco::Rosemaryは定数参照とみなされますが、Rubyco.Rosemaryはメソッド呼び出しとみなされます。 class Rubyco Rosemary = 123 def self.Rosemary return 456 end end p Rubyco::Rosemary # => 123 p Rubyco.Rosemary # => 456 p Rubyco::Rosemary() # =>…

super

Rubyのsuperは元メソッドを呼び出しますが、括弧と引数がないときには元メソッドの引数がそのまま渡されます。 class Parent def rubyco(x = 123, y = 456) print "Parent: rubyco(#{x}, #{y})\n" end end class Child < Parent def rubyco(x, y) if x == 0 …

配列の参照・代入

Rubyでは、配列の参照はというメソッド、代入は=というメソッドになります。 class RubycoArray def initialize(size) @arr = [] @size = size end def []=(index, value) if index < 0 or @size <= index raise "index is out of bounds" else @arr[index] …

クラス名は大文字

Rubyのクラス名は大文字で始めます(定数になります)。 class rubyco # class/module name must be CONSTANT end

eval

evalで評価できます。 eval <<"EOD" class Rubyco def self.hello print "Hello!\n" end end EOD Rubyco.hello

self.new

クラスメソッドnewを(superを呼ばずに)オーバーライドしてしまうと、newできなくなります。 class Rubyco def self.new print "new is overridden.\n" end def hello print "Hello!\n" end end a = Rubyco.new p a # => nil a.hello # => undefined method `…

self.newのすげかえ

クラスメソッドnewの最後にsuperじゃなく、他のオブジェクトを作ってみました。動きますね。 class Rosemary def hello print "Hello, Rosemary!\n" end end class Rubyco def self.new print "new is overridden.\n" Rosemary.new end def hello print "Hel…

モジュール

Rubyのmoduleはインスタンスを作れないクラスです。ということは、モジュールというのはネームスペースのようなものかしら。 module RubycoModule HELLO = 123 def self.hello print "Hello!\n" end end # a = RubycoModule.new # undefined method `new' fo…

モジュールとnew

でも、もちろん無理やりモジュールメソッドとしてnewを作ることはできますけれどね。 class RubycoClass def hello print "Hello!\n" end end module RubycoModule def self.new return RubycoClass.new end end a = RubycoModule.new a.hello # => Hello!

mixin

Rubyではincludeメソッドを使って、定義をインクルードできます。ということは、モジュールというのは抽象クラスのようなものかしら。 module RubycoModule def hello print "Hello!\n" end end class RubycoClass include RubycoModule end a = RubycoClass…

モジュールとmixin

Rubyのモジュールをincludeすると、実質的に多重継承ができます。 module DebugPrint def debug_print p self end end class Rubyco include DebugPrint def initialize(name) @name = name end end class Diamond include DebugPrint def initialize(x, y, …