Как мне преобразовать строку в ссылку на переменную в Ruby? - PullRequest
0 голосов
/ 06 марта 2011

Мне нужно иметь возможность передать имя переменной в выражение (в огурце) и хотел бы иметь возможность преобразовать эту строку в ссылку (т.е. не копию) переменной.

например,

Given /^I have set an initial value to @my_var$/ do
  @my_var = 10
end

# and now I want to change the value of that variable in a different step
Then /^I update "([^"]*)"$/ do |var_name_string|
  # I know I can get the value of @my_var by doing:
  eval "@my_var_copy = @#{var_name_string}"

  # But then once I update @my_var_copy I have to finish by updating the original
  eval "@#{var_name_string} = @my_var_copy"

  # How do instead I create a reference to the @my_var object?
end

Так как Ruby - такой рефлексивный язык, я уверен, что то, что я пытаюсь сделать, возможно, но я еще не взломал его.

Ответы [ 3 ]

2 голосов
/ 06 марта 2011
  class Reference
    def initialize(var_name, vars)
      @getter = eval "lambda { #{var_name} }", vars
      @setter = eval "lambda { |v| #{var_name} = v }", vars
    end
    def value
      @getter.call
    end
    def value=(new_value)
      @setter.call(new_value)
    end
  end

Получил от http://onestepback.org/index.cgi/Tech/Ruby/RubyBindings.rdoc. Удачи!

1 голос
/ 06 марта 2011

Решением может быть упаковка объектов в массив.Который может быть легко передан по ссылке.

irb(main):001:0> my_var = [10]
=> [10]
irb(main):002:0> my_var_copy = my_var
=> [10]
irb(main):003:0> my_var[0] = 55
=> 55
irb(main):004:0> my_var_copy
=> [55]

Смотрите здесь - http://www.rubyfleebie.com/understanding-fixnums/

И (немного не по теме, но дал мне первоначальную идею для решения) здесь- http://ruby.about.com/od/advancedruby/a/deepcopy.htm

0 голосов
/ 06 марта 2011

Может ли obj.instance_variable_get и obj.instance_variable_set помочь вам?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...