【发布时间】: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