在哪里学习ruby DSL?
我在上面(流浪的dsl)代码上苦苦挣扎。这是Ruby DSL还是普通Ruby还是其他什么?为什么vm.box和vm.hostname有一个“=”符号,而vm.network没有?首先,它是ruby,当您想要创建自己的DSL时,它作为一种语言非常方便。所有的DSL都是使用基本的ruby概念构建的,比如块(在哪里学习ruby DSL?,ruby,vagrant,dsl,Ruby,Vagrant,Dsl,我在上面(流浪的dsl)代码上苦苦挣扎。这是Ruby DSL还是普通Ruby还是其他什么?为什么vm.box和vm.hostname有一个“=”符号,而vm.network没有?首先,它是ruby,当您想要创建自己的DSL时,它作为一种语言非常方便。所有的DSL都是使用基本的ruby概念构建的,比如块(do…end)-这里没有魔法。 在你的情况下,我们可以说这是流浪业主创建的DSL 为什么他们一次使用=,另一次不使用?在这个特定的例子中,我假设这是因为您有一个参数是字符串,并且是必需的,稍后您可
do…end
)-这里没有魔法。
在你的情况下,我们可以说这是流浪业主创建的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
如果他们想使用=
,他们必须强制您传递一个哈希,其中需要name key,其余的是可选的,我的意思是这样的:
Vagrant.configure("2") do |config|
config.vm.network "forwarded_port", guest: 80, host: 8080
end
chefserver.vm.hostname = 'chefserver' # calls method 'hostname='
chefserver.vm.network "public_network" # calls method 'network'
这是标准的Ruby,这里没有DSL或元编程魔法 Ruby在这方面是不寻常的,但以下两个都是对chefserver.vm返回的对象的调用方法:
config.vm.network = { name: "default" }
Ruby不需要在方法调用中使用括号(尽管有时它们是向解释器阐明您的意思所必需的)
我不认识Chef,所以我不能说为什么网络
调用不是网络=
,除了在Ruby中调用名称以'='结尾并带有多个参数的方法不起作用。尽管这里只指定了网络
的1个参数,但在Ruby中可以有可选参数。该方法可能定义如下:
Vagrant.configure("2") do |config|
config.vm.network "forwarded_port", guest: 80, host: 8080
end
chefserver.vm.hostname = 'chefserver' # calls method 'hostname='
chefserver.vm.network "public_network" # calls method 'network'
…因此可以使用1或2个参数调用该方法。Ruby DSL是纯Ruby。谢谢!事实证明,要在chef,vagrant这样的框架中了解和编写代码,必须对Ruby语言有很好的理解,而不是依赖“学习Y所需的最小X”之类的文章,我认为在这种情况下绝对不适用。