Newbie question: how to create variable

Hi,

how to create variable in the method that accepts string as name of the
variable and the object?

Something like this:

class InterpreterCallback
def set_object(name, value)
#do something here
end
end

$callback = InterpreterCallback.new()
$callback.set_object(“var”, 3)

puts var

Karel M. wrote:

Hi,

how to create variable in the method that accepts string as name of the variable and the object?

Something like this:

class InterpreterCallback
def set_object(name, value)
#do something here

instance_variable_set("@#{name}", value)

end

end

$callback = InterpreterCallback.new()
$callback.set_object(“var”, 3)

puts var

3

Alternatively you can use an OpenStruct.

Kind regards

robert

On Aug 11, 2006, at 12:55 PM, Robert K. wrote:

$callback = InterpreterCallback.new()
$callback.set_object(“var”, 3)
puts var

3

Depending on what you’re trying to do, you might be able to use a
simple eval statement:
irb(main):001:0> name=“var”
=> “var”
irb(main):002:0> value=“3”
=> “3”
irb(main):003:0> eval “#{name} = value”
=> “3”
irb(main):004:0> var
=> “3”

Hi –

On Sat, 12 Aug 2006, Mr Pinto wrote:

end
irb(main):002:0> value=“3”
=> “3”
irb(main):003:0> eval “#{name} = value”
=> “3”
irb(main):004:0> var
=> “3”

That only works in irb. With ruby you’ll get:

ruby -e ‘name=“var”; value=“3”; eval("#{name}=#{value}"); var’
-e:1: undefined local variable or method `var’ for main:Object
(NameError)

David

end
irb(main):002:0> value=“3”
(NameError)

David

None of this actually works quite well for me. I am using SWIG directors
to embed ruby (and python, perl) into C# application trough C++ layer.
value actually wraps C++ object . InterpreterCallback actually extends
c++ class and I am calling set_object() from C++ - set_object(“editor”,
getEditor() ) - “editor” then can be used in the global namespace for
scripting convenience:

editor.DrawGrid

I actually get it working with

def set_object(var, value)
  eval("def #{var}; $#{var}; end; proc{|_v| $#{var} = _v}", 

TOPLEVEL_BINDING).call(value)
end

but it goes through global variable. I believe there is simpler way how
to do this.
Kind regards,
Karel