Ruby 与chef语法混淆
查看以下厨师代码行:Ruby 与chef语法混淆,ruby,chef-infra,Ruby,Chef Infra,查看以下厨师代码行: node.default['apache']['dir'] = '/etc/apache2' 在官方的chef文档中,它说“node”是一个对象,“default”是它的一个方法,那么方括号(我认为这是散列语法)如何遵循方法呢 我来自Python背景,对Ruby不熟悉,可能这是通用语法,也可能这是Chef特有的语法,我只是对这种语法感到困惑。node.default()(它实际上是node.attributes().default()的别名)返回Chef
node.default['apache']['dir'] = '/etc/apache2'
在官方的chef文档中,它说“node”是一个对象,“default”是它的一个方法,那么方括号(我认为这是散列语法)如何遵循方法呢
我来自Python背景,对Ruby不熟悉,可能这是通用语法,也可能这是Chef特有的语法,我只是对这种语法感到困惑。node.default()
(它实际上是node.attributes().default()的别名)返回Chef::Node::livitmash
的实例,该实例的工作方式类似于普通的散列
对象,但实现了您在那里看到的深集行为(您可以在不创建中间级别的情况下设置深嵌套键)
tl;dr不必担心,我们做了很多对象欺骗来让DSL看起来尽可能好。显然,节点上的default
方法返回实现了[]
方法的东西-很可能是散列的一个实例default
返回散列?Ruby真的没有什么特别之处,在Python中也可以做同样的事情。哦,不,这不是厨师特有的语法。它不可能是特定于Chef的语法,因为Ruby与Python和99.999%的编程语言一样,不允许库更改其语法。“你可能在想卡塔丁之类的事。”斯皮克曼显然是这样想的?对于一个“Ruby新手”来说,这是如何显而易见的?Ruby有很多令人困惑的特性,而且文档通常都很糟糕。除非你已经将大量信息内化,否则“显而易见”很少适用于Ruby。无论如何,@Ursus做得对,node.default['a']['b']=…
只是obj=node.default();obj['a']['b']=…
,而obj
的行为类似于嵌套哈希。如果您认为这会有所帮助,您可以进行跟踪(如果您要学习Ruby,那么习惯于阅读库源代码,这通常是了解所有“魔力”背后发生了什么的唯一方法。)@JörgWMittag lol,如果func是一个在Python中返回dict的方法,那么您可以使用这种语法:func['foo']?