Переменные class_eval в Ruby 1.9.2

В Settingslogic fork, разрешающем массив в качестве источника, в ruby ​​1.8.7 все работает, но в ruby ​​1.9.2 есть ошибка. Проблема в этой части кода:

self.class.class_eval <<-EndEval
  def #{key}
    return @#{key} if @#{key}
    raise MissingSetting, "Missing setting '#{key}' in #{@section}" unless has_key? '#{key}'
    value = fetch('#{key}')
    @#{key} = value.is_a?(Hash) ? self.class.new(value, "'#{key}' section in #{@section}") : value
  end
EndEval

@section == ["path_to_yml_file1", "path_to_yml_file2",...]

Похоже, #{} оценивается каким-то странным образом, "#{@section}" кажется массивом, а не строкой. Кто-нибудь может это объяснить?

Трассировка ошибки:

@section == ["User/project/config/defaults.yml", "/Users/project/config/development.yml"]


ruby-1.9.2-p290 :001 > Settings.keys
SyntaxError: (eval):3: syntax error, unexpected tSTRING_BEG, expecting keyword_end
...project/config/defaults.yml", "/Users/project...
...                               ^
(eval):3: syntax error, unexpected tSTRING_BEG, expecting keyword_end
...project/config/development.yml"]" unless has_key? 'front'
...                               ^
(eval):5: syntax error, unexpected tSTRING_BEG, expecting ')'
...project/config/defaults.yml", "/Users/project...
...                               ^
(eval):5: syntax error, unexpected tSTRING_BEG, expecting keyword_end
...project/config/development.yml"]") : value
...                               ^
(eval):5: syntax error, unexpected ')', expecting keyword_end
...project/config/development.yml"]") : value
...                               ^

from .../settingslogic-3b5d7d9cc319/lib/settingslogic.rb:198:in `class_eval'

Спасибо за любую помощь


person santuxus    schedule 09.11.2011    source источник
comment
О чем @section == ["User/project/config/defaults.yml", "/Users/project/config/development.yml"]?   -  person mu is too short    schedule 09.11.2011
comment
просто ярлык, чтобы показать, каково значение @section в данный момент...   -  person santuxus    schedule 14.11.2011


Ответы (2)


Вы сделали ответвление от основного settingslogic. В то время он не поддерживал массив в качестве источника, но теперь поддерживает. Попробуйте использовать основной репозиторий settingslogic.

Ваша ошибка теперь связана с этой строкой:

raise MissingSetting,
  "Missing setting '#{key}' in #{@section}" unless has_key? '#{key}'

потому что в случае использования массива вместо строки

./settings.yml

вы получаете что-то вроде этого:

[\"./settings.yml\"]

То же самое происходит с назначением @#{key} ниже. В основном репозитории этот код заменен на конкатенацию строк.

person WarHog    schedule 09.11.2011
comment
Хммм - так какая ветка главная? Потому что github.com/binarylogic/settingslogic кажется основным, но не поддерживает массив в качестве источника. .. - person santuxus; 14.11.2011
comment
Упс, кажется, я допустил ошибку :( Пожалуйста, посмотрите на это: github.com/greghaygood/settingslogic Это форк от greghaygood, и он добавил поддержку нескольких файлов. - person WarHog; 14.11.2011
comment
Без проблем. ;) Это: github.com/siliconsalad/settingslogic тоже работает — разница в том, что greghaygood использует args* и второй массив решений явно. Теперь это также было изменено на конкатенацию строк. Я просто не понимаю, почему... #{@section} в этом коде было нормально в ruby ​​1.8 и не работает в ruby ​​1.9.2... - person santuxus; 14.11.2011

Попробуйте self.class_eval или даже без себя, не нужно получать имя класса, а я автоматически назначаю текущий объект, то есть ваш класс.

person megas    schedule 09.11.2011
comment
Нет, эта часть кода предназначена для работы с Class объектом и определения методов внутри него. - person WarHog; 09.11.2011
comment
Я проверил свой ответ с помощью этого класса кода Test; self.class_eval (def test; ставит «тест»; конец); конец. Он создает тестовый метод для тестового класса, а затем я могу получить объект с помощью этого метода. Разве ты не этого хочешь? - person megas; 09.11.2011
comment
Это был не мой вопрос :) Я имел в виду, что self.class.class_eval является частью settingslogic и проблема не связана с этой частью кода. Автор этой библиотеки хочет добавить методы (вычисленные через def #{key}) в объект Class, а не в объект Test, чтобы эти методы стали методами класса любого класса (Test.test, Object.test и т.д.). Это довольно странно, но решать автору этой жемчужины ;) - person WarHog; 09.11.2011