Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 与chef语法混淆_Ruby_Chef Infra - Fatal编程技术网

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']?