【问题标题】:Confused with chef syntax对厨师语法感到困惑
【发布时间】:2018-06-02 05:34:56
【问题描述】:

看下面这行厨师代码:

node.default['apache']['dir']          = '/etc/apache2'

在官方厨师文档中,它说'node'是一个对象,'default'是它的一个方法,那么方括号(我认为这是哈希语法)如何跟随一个方法?

我来自 Python 背景,我是 Ruby 新手,也许这是通用语法,或者这是 Chef 特定的语法,我只是对这种语法感到困惑。

【问题讨论】:

  • 很明显,node 上的default 方法返回了实现了[] 方法的东西——很可能是Hash 的一个实例。
  • default 返回一个哈希?这对 Ruby 来说并没有什么特别之处,你可以在 Python 中做同样的事情。哦,不,这不是 Chef 特定的语法。它不可能可能是 Chef 特定的语法,因为 Ruby 与 Python 和 99.999% 的编程语言一样,不允许库更改其语法。您可能正在考虑像 Katahdin 这样的东西。
  • @spickermann 很明显?这对“Ruby 新手”来说是多么明显? Ruby 有很多令人困惑的特性,而且文档通常很差,“显而易见”很少适用于 Ruby,除非你已经内化了大量信息。
  • 无论如何,@Ursus 说得对,node.default['a']['b'] = ... 只是 obj = node.default(); obj['a']['b'] = ...,而 obj 的行为类似于嵌套哈希。如果您认为这会有所帮助,您可以通过the source 进行追踪(如果您打算使用 Ruby,请习惯阅读库源代码,这通常是弄清楚所有“魔法”背后发生了什么的唯一方法) .
  • @JörgWMittag 大声笑,如果 func 是 Python 中返回 dict 的方法,你可以使用这种语法:func['foo'] 吗?

标签: ruby chef-infra


【解决方案1】:

node.default()(实际上是node.attributes().default() 的别名)返回一个Chef::Node::VividMash 的实例,它的工作方式类似于普通的Hash 对象,但实现了您在那里看到的深层行为(您可以设置一个深度嵌套的键而不创建中间级别)。

tl;dr 别担心,我们做了很多对象技巧以使 DSL 看起来尽可能好。

【讨论】:

    猜你喜欢
    • 2013-11-21
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-26
    • 1970-01-01
    • 2016-12-27
    • 1970-01-01
    相关资源
    最近更新 更多