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をレシーバーとします.