eval
eval関数を使うと、指定した式を評価することができる。式を文字列として指定するので、構文エラーとなるような文字列を指定したら例外が発生する。
使用例
# 計算を実行
eval("1 + 2") # -> 3
eval("1 * 2") # -> 2
# 変数を使用して計算の実行
num = 100
eval("num + num") # -> 200
# 変数に値を設定
class Hoge
attr_accessor :id
end
# idプロパティに値を設定
hoge = Hoge.new
eval("hoge.id=100")
puts hoge.id # -> evalで設定された100が取得される
# インスタンス変数の宣言
eval("@hogehoge = 'hoge'")
puts @hogehoge # -> @hogehogeが参照でき、'hoge'が取得できる。
# ローカル変数の宣言
# eval内で宣言されたローカル変数のスコープは、evalの処理を抜けたら参照できない。
eval("hogehoge = 12345; puts hogehoge") # -> ここでは、ローカル変数を参照できる。
begin
# evalを抜けているので参照すると、未定義ですよエラーが発生する
puts hogehoge
rescue => e
puts e.message
end
インスタンスに対する操作
任意のインスタンス(クラス)のインスタンス変数やクラス変数の値参照や値設定方法例
# インスタンス変数の操作
object = Object.new
# nameインスタンス変数は、存在していないのでfalse
object.instance_variable_defined?(:@name)
# nameインスタンス変数に値(instance_variable)を設定
object.instance_variable_set(:@name, "instance_variable")
# instance_variable_getが返される
object.instance_variable_get(:@name)
# nameインスタンス変数が追加されたのでtrue
object.instance_variable_defined?(:@name)
# nameインスタンス変数を削除
object.instance_eval { remove_instance_variable :@name }
# nameインスタンス変数は削除されたのでfalse
object.instance_variable_defined?(:@name)
# クラス変数に値をセット(宣言されていなければ追加される。)
# nameクラス変数は存在していないのでfalse
puts Object.class_variable_defined? :@@name
# nameクラス変数に値(class_variable)を設定
Object.class_variable_set(:@@name, "class_variable")
# class_variable_getが返される
puts Object.class_variable_get(:@@name)
# nameクラス変数が追加されたのでtrue
puts Object.class_variable_defined? :@@name
# nameクラス変数を削除
Object.class_eval { remove_class_variable :@@name }
# nameクラス変数は削除されたのでfalse
puts Object.class_variable_defined? :@@nameメソッドに対する操作
メソッド一覧の参照や、メソッドの実行ができる。また、動的にインスタンスにメソッドを追加することもできたりする。例
object = Object.new # public_methodsでも同じことができる。 object.methods # 継承したメソッドを除外(自クラスで宣言したメソッドのみが出力される。) # trueにすると、methodsと同じ動きになる。ちなみに引数省略した場合は、true object.public_methods false # 他にも、private_methodsやprotected_methodsがある。 # 特異メソッドの定義(このインスタンスのみがもつメソッド) def object.hoge "fuga" end object.hoge object.public_methods false # メソッド呼び出し hoge = "hogehoge" hoge.send(:upcase) # upcaseメソッドの呼び出し(メソッドは、シンボルとして指定する。)