Array
,Hash
など)をクラス定数にして代りに使ってください.
class Foo
F = [0]
def foo
F[0] += 1
print F[0], "\n"
end
end
class Foo
@a = 123 # (1)
def foo
p @a # (2) ... 123でなくnilになる.
end
end
(1)がクラスのインスタンス変数,(2)が通常のインスタンス変数です.(2)は
クラスFoo
のインスタンスに属するのに対し,(1)はFoo
というクラ
スオブジェクト(Class
のインスタンス)に属します.
nil
になり
ます.
foo = Foo.new
def foo.hello
print "Hello\n"
end
foo.hello
クラスにあるメソッドを追加したいが,わざわざサブクラスを作るほどのこと
でもない,といった場合に有効です.
Class
のインスタンスであるFoo
の特異メソッドを考えてみま
しょう.
class Foo
def Foo.test
print "this is foo\n"
end
end
呼び出す時はこうです.
Foo.test
何か気付きませんか?
Class
で定義されているメソッドもクラスメソッドとして使えま
す.
class Foo
def hello
print "hello.\n"
end
end
foo = Foo.new
foo.hello
# -> hello.
class << foo
attr :name, TRUE
def hello
print "hello. I'm ", @name, ".\n"
end
end
foo.name = "Tom"
foo.hello
# -> hello. I'm Tom.
なんかすごいですよね.
private_class_method
を使わずにクラスメソッドをprivateにす
るにはどうすればよいでしょう?
class Foo
...
end
class << Foo
def class_method
print "class method\n"
end
private :class_method
end
Foo.class_method " # -> Error
特異メソッドを定義するには,このように特異クラスで定義する方法と
直接 def obj.method という風に定義してしまう方法があります.
Math.sqrt(2)
のように用いることも,
include Math
sqrt(2)
のようにinclude
して用いることもでき,とても便利です.
module_function :method_name
とします.
load
とrequire
はどう違いますか
load
はRubyで書かれたソース(*.rb
)のみロードします.
require
は*.o
ファイルもロードします.さらに一度
require
したファイルは2度require
してもロードしません.
include
とextend
はどう違いますか
include
はmodule
をクラス(モジュール)にインクルードして,
メソッドを関数形式で呼べるようにし,extend
は
module
をオブジェクト(インスタンス)にインクルードして,メソッドを
特異メソッドとして追加します.
self
というのは何ですか
self
は,メソッドが適用されるオブジェクトそれ自身を表わします.
関数形式のメソッドは,self
をレシーバーとします.