在哪里学习 ruby DSL?
Where to learn ruby DSL?
Vagrant.configure(2) do |config|
config.vm.define "chefnode" do |chefnode|
chefnode.vm.box = "geerlingguy/ubuntu1604"
chefnode.vm.hostname = 'cnode'
chefnode.vm.network "public_network"
end
config.vm.define "chefserver" do |chefserver|
chefserver.vm.box = "geerlingguy/ubuntu1604"
chefserver.vm.hostname = 'cserver'
chefserver.vm.network "public_network"
end
end
我在上面的 (vagrant dsl) 代码上苦苦挣扎。这是 Ruby DSL 还是纯 Ruby 还是其他?为什么 vm.box 和 vm.hostname 有一个“=”符号,而 vm.network 却没有?
首先是 ruby,当您想创建自己的 DSL 时,它作为一种语言非常方便。所有 DSL 都是使用基础 ruby 概念构建的,例如块 (do ... end
) - 这里没有魔法。
在您的情况下,我们可能会说它是由 Vagrant 所有者创建的 DSL。
为什么他们一次使用 =
而另一次不用?在这种特定情况下,我假设这是由于您有一个参数是 String 并且是必需的,稍后您可能会传递具有不同设置选项的哈希值,例如文档中的示例。
Vagrant.configure("2") do |config|
config.vm.network "forwarded_port", guest: 80, host: 8080
end
如果他们想使用 =
,他们将不得不强制您传递一个 Hash,其中 name key 是必需的,其余的是可选的,我的意思是这样的:
config.vm.network = { name: "default" }
这是标准的 Ruby,这里没有 DSL 或元编程魔法。
Ruby在这方面是不寻常的,但是下面都是对chefserver.vm
返回的对象的调用方法:
chefserver.vm.hostname = 'chefserver' # calls method 'hostname='
chefserver.vm.network "public_network" # calls method 'network'
Ruby 不需要在方法调用中使用括号(尽管有时它们是向解释器阐明您的意思所必需的)。
我不了解 Chef,所以我不能说为什么 network
调用不是 network=
,除了在 Ruby 中调用名称以 ' 结尾的方法=' 超过 1 个参数不起作用。虽然这里只指定了 network
的 1 个参数,但在 Ruby 中可以有可选参数。该方法可能定义如下:
def network(name, something = 'foo')
# ...
end
...以便可以使用 1 个或 2 个参数调用该方法。
Vagrant.configure(2) do |config|
config.vm.define "chefnode" do |chefnode|
chefnode.vm.box = "geerlingguy/ubuntu1604"
chefnode.vm.hostname = 'cnode'
chefnode.vm.network "public_network"
end
config.vm.define "chefserver" do |chefserver|
chefserver.vm.box = "geerlingguy/ubuntu1604"
chefserver.vm.hostname = 'cserver'
chefserver.vm.network "public_network"
end
end
我在上面的 (vagrant dsl) 代码上苦苦挣扎。这是 Ruby DSL 还是纯 Ruby 还是其他?为什么 vm.box 和 vm.hostname 有一个“=”符号,而 vm.network 却没有?
首先是 ruby,当您想创建自己的 DSL 时,它作为一种语言非常方便。所有 DSL 都是使用基础 ruby 概念构建的,例如块 (do ... end
) - 这里没有魔法。
在您的情况下,我们可能会说它是由 Vagrant 所有者创建的 DSL。
为什么他们一次使用 =
而另一次不用?在这种特定情况下,我假设这是由于您有一个参数是 String 并且是必需的,稍后您可能会传递具有不同设置选项的哈希值,例如文档中的示例。
Vagrant.configure("2") do |config|
config.vm.network "forwarded_port", guest: 80, host: 8080
end
如果他们想使用 =
,他们将不得不强制您传递一个 Hash,其中 name key 是必需的,其余的是可选的,我的意思是这样的:
config.vm.network = { name: "default" }
这是标准的 Ruby,这里没有 DSL 或元编程魔法。
Ruby在这方面是不寻常的,但是下面都是对chefserver.vm
返回的对象的调用方法:
chefserver.vm.hostname = 'chefserver' # calls method 'hostname='
chefserver.vm.network "public_network" # calls method 'network'
Ruby 不需要在方法调用中使用括号(尽管有时它们是向解释器阐明您的意思所必需的)。
我不了解 Chef,所以我不能说为什么 network
调用不是 network=
,除了在 Ruby 中调用名称以 ' 结尾的方法=' 超过 1 个参数不起作用。虽然这里只指定了 network
的 1 个参数,但在 Ruby 中可以有可选参数。该方法可能定义如下:
def network(name, something = 'foo')
# ...
end
...以便可以使用 1 个或 2 个参数调用该方法。