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 DSL?_Ruby_Vagrant_Dsl - Fatal编程技术网

在哪里学习ruby DSL?

在哪里学习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 为什么他们一次使用=,另一次不使用?在这个特定的例子中,我假设这是因为您有一个参数是字符串,并且是必需的,稍后您可

我在上面(流浪的dsl)代码上苦苦挣扎。这是Ruby DSL还是普通Ruby还是其他什么?为什么vm.box和vm.hostname有一个“=”符号,而vm.network没有?

首先,它是ruby,当您想要创建自己的DSL时,它作为一种语言非常方便。所有的DSL都是使用基本的ruby概念构建的,比如块(
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”之类的文章,我认为在这种情况下绝对不适用。