Ruby 1.9.2 class_eval变量

时间:2011-11-09 14:25:18

标签: ruby ruby-1.9.2 class-eval

在允许数组作为源的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'

感谢您的帮助

2 个答案:

答案 0 :(得分:1)

你从主settingslogic做了一个分叉。那时它不支持数组作为源,但现在它确实如此。尝试使用主settingslogic存储库。

您的错误现在与此字符串相关:

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

因为在使用数组而不是字符串

的情况下
./settings.yml
你得到这样的东西:

[\"./settings.yml\"]

下面的@#{key}分配也是如此。在主存储库中,此代码替换为字符串连接。

答案 1 :(得分:0)

尝试self.class_eval或甚至没有自我,不需要获取类的名称,并且自动分配给当前对象,即您的班级。