class_eval
を使用して、現在のクラスのコンテキストで実行されるコードを記述しています。次のコードでは、属性値の変更のためのカウンタを追加したいと思います。私の場合には、class Foo
下 -`class_eval`文字列内の可変スコープとは何ですか?
class Class
def attr_count(attr_name)
attr_name = attr_name.to_s
attr_reader attr_name # create the attribute's getter
class_eval %Q{
@count = 0
def #{attr_name}= (attr_name)
@attr_name = attr_name
@count += 1
end
def #{attr_name}
@attr_name
end
}
end
end
class Foo
attr_count :bar
end
f = Foo.new
f.bar = 1
class_eval
の私の理解では、ランタイムクラスのコンテキストでブロックを評価していることです。
class Foo
attr_count :bar
@count = 0
def bar= (attr_name)
@attr_name = attr_name
@count += 1
end
def bar
@attr_name
end
end
上記のコードはエラーが@count += 1
によって引き起こされる、というエラーになったしかし:私はとして実行同様の上記のコードを期待しています。私はなぜ@count
がnil:NilClass
をそのスーパーとして持っているのか分かりませんか?一方
(eval):5:in `bar=': undefined method `+' for nil:NilClass (NoMethodError)
、@selmanはインスタンスメソッド内@count
割り当てを置くためのソリューションを与えているし、それが動作します。
class Class
def attr_count(attr_name)
#...
class_eval %Q{
def #{attr_name}= (attr_name)
@attr_name = attr_name
if @count
@count += 1
else
@count = 1
end
end
#...
}
end
end
なぜ可変スコープが機能するのですか? class_eval
は次の文字列をどのように実行しますか?
CS169クラスはどのように気に入っていますか? :) –