【问题标题】:How to declare a ruby constant (RMagick) in a YAML file如何在 YAML 文件中声明 ruby​​ 常量 (RMagick)
【发布时间】:2017-01-21 14:23:44
【问题描述】:

我正在寻找一种可能性,可以在 .yml 文件中声明一个 Magick::StyleType 常量,然后将此常量加载到 ruby​​ 文件中。 或者,如果这不可能,那么我需要知道如何将字符串转换为 ruby​​ 中的 Magick::StyleType 常量。

以下是详细信息:

我正在尝试编写一个 ruby​​ 程序,它在图片上放置一些文本,我使用 RMagick 界面。 在我的 ruby​​ 程序中,我有一个方法可以指定文本的不同属性,例如 font-family 或 font-style。此方法包括以下行:

self.font_style = ItalicStyle

现在我想将所有可更改的参数存储在一个 YAML 配置文件 (config.yml) 中,所以这个 config.yml 包含以下几行:

#font style (like bold, italic and so on)
:font_style: ItalicStyle

现在我将 config.yml 加载到我的 ruby​​ 文件中,并且我的方法中的上述行现在读取

self.font_style = config_file[:font_style]

当我现在运行我的 ruby​​ 文件时,我收到错误消息:

`font_style=': wrong enumeration type - expected Magick::StyleType, got String (TypeError)

因此,在搜索了一些关于该主题的内容后,我首先将 config.yml 更改为

:font_style: !/ruby/constant ItalicStyle

这给了我与上面相同的错误消息,然后我尝试了这个:

:font_style: !/ruby/symbol :ItalicStyle

并收到此错误消息:

`font_style=': wrong enumeration type - expected Magick::StyleType, got Symbol (TypeError)

然后我签入了irb:

require 'rmagick' => true

Magick.const_get(ItalicStyle) => ItalicStyle=2
Magick.const_get(ItalicStyle).class => Magick::StyleType

所以,最后我得到了我的问题:我需要如何更改线路

:font_style: !/ruby/symbol :ItalicStyle

在我的 config.yml 文件中,以便在加载到我的 ruby​​ 文件时 ItalicStyle 将被识别为 Magick::StyleType 常量?

或者当我离开时

:font_style: ItalicStyle

在 config.yml 中并将 ItalicStyle 作为字符串加载到我的 ruby​​ 文件中:是否有可能将 ItalicStyle 从字符串直接转换为 ruby​​ 文件中的 Magick:StyleType 常量?

如果有人可以提供帮助,我会非常高兴。我已经尝试了几天来寻找解决方案,我的项目确实需要它。

【问题讨论】:

  • 将默认值 转储 到 yaml 以检查它们应该是什么样子有什么问题?有关正确的解决方案,请参阅下面@spickermann 的答案。

标签: ruby constants configuration-files rmagick


【解决方案1】:

我只会在YAML 文件中存储一个String,因为这样更容易编写和阅读:

:font_style: ItalicStyle

我会通过其名称获取常量来配置Magick

self.font_style = Object.const_get(config_file[:font_style])

【讨论】:

  • 如果您不介意,我还有一个问题:在发布问题之前,我已经在 irb 中尝试了 const_get 方法。但这是我不明白的:
  • 在我的 ruby​​ 程序中,“self.font_style = Object.const_get(config_file[:font_style])”行确实有效。但是当我启动 irb 并在那里输入“require 'rmagick'”然后输入“Object.const_get(“ItalicStyle”)”时,我收到一个错误“NameError: uninitialized constant ItalicStyle”。这是为什么呢?
  • 您必须先要求 rmagick。您可能在您的应用程序中执行此操作,但在 irb 控制台中没有执行此操作。
  • 感谢您的回答,但不,首先在 irb 中输入“require 'rmagick'” => true。然后我输入 "Object.const_get("ItalicStyle")" 然后我得到了我之前提到的 NameError。但是“Magick.const_get("ItalicStyle")”返回“ItalicStyle=2”。在 ruby​​ 程序中,两个版本都可以工作。令人费解...
猜你喜欢
  • 1970-01-01
  • 2012-09-26
  • 1970-01-01
  • 2011-01-17
  • 1970-01-01
  • 1970-01-01
  • 2019-11-30
  • 1970-01-01
  • 2011-06-23
相关资源
最近更新 更多