2011-11-09 2 views
0

В Settingslogic fork разрешение массива как источника, в ruby ​​1.8.7 все работает, но в ruby ​​1.9.2 есть ошибка. Проблема находится в этой части кода:Ruby 1.9.2 переменные class_eval

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 == ["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' 

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

+0

Что такое '@section == [" User/project/config/defaults.yml "," /Users/project/config/development.yml "]' все о? –

+0

просто ярлык, чтобы показать, каково значение @section на данный момент ... – santuxus

ответ

1

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

Ваша ошибка в настоящее время связаны с этой строкой:

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

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

./settings.yml 

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

[\"./settings.yml\"] 

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

+0

Хммм - так какая ветка главная? Поскольку https://github.com/binarylogic/settingslogic кажется основным, но он не поддерживает массив как источник ... – santuxus

+0

К сожалению, я сделал ошибку :(Пожалуйста, посмотрите на это: https://github.com/greghaygood/settingslogic. Это вилка из greghaygood, и он добавил поддержку нескольких файлов. – WarHog

+0

Нет проблем.;) Это: https://github.com/siliconsalad/settingslogic также работает - разница в том, что greghaygood использует args * и второго массива решений явно. Теперь он также был изменен на конкатенацию строк. Я просто не понимаю, почему «... # {@ section}» в этом коде было нормально в ruby ​​1.8, и он не работает в ruby ​​1.9.2 ... – santuxus

0

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

+0

Нет, эта часть кода предназначена для работы с объектом 'Class' и определения методов внутри него. – WarHog

+0

Я проверил свой ответ на этот код «class Test; self.class_eval (« def test; puts 'test »; end»); end ». Он создает метод тестирования для класса Test, а затем я могу получить объект с помощью этого метода. Разве ты этого не хочешь? – megas

+0

Это не мой вопрос :) Я имел в виду, что 'self.class.class_eval' является частью' settingslogic', и проблема не связана с этой частью кода. Автор этой библиотеки хочет добавить методы (оцениваемые через 'def # {key}') к объекту класса, а не к объекту Test, чтобы эти методы стали методами класса любого класса (Test.test, Object.test и т. Д.). Это довольно странно, но до автора этого драгоценного камня;) – WarHog

 Смежные вопросы

  • Нет связанных вопросов^_^