这是一个很好的问题。它可能是重复的,但我找不到,这对于刚接触 Ruby 的聪明程序员来说是一件棘手的事情。
首先,对于你的问题:什么是connection
?
这是一个方法调用。在某些情况下,很难分辨什么是方法,什么是变量,因为这仅取决于它们的定义方式。但在这种情况下很清楚,因为connection
它后面有参数。在 ruby 中,可以这样调用方法:
foo
在这种情况下,它是一个不带参数的方法。或者它看起来像这样:
foo 1, 2, 3
那是一个带有三个参数的方法。或者它看起来像这样:
foo(1, 2, 3)
这是相同的方法,但语法略有不同(人们对 c、C++、Java、Javascript、C# 等 c 模拟语言的体验更熟悉)
因此,当您看到在一个空词之后列出的参数,中间没有运算符时,这肯定是一个方法调用。
现在完全分解你的代码。
require 'artoo'
这在技术上是一个方法调用。您正在调用该require
方法并传递文字 string 的单个参数'artoo'
。您可能知道,require
将外部 ruby 文件加载到当前文件中。
connection :keyboard, adaptor: :keyboard
这是一个带有一些语法糖的方法调用:
您马上就知道这connection
是一个方法调用,因为它后面有参数(即在其后没有操作符connection
)。但是什么参数呢?
:keyboard
: 是一个Symbol,它相当于 ruby 的实习生 string。
adaptor: :keyboard
是一个哈希。
Ruby 有两种主要的哈希语法:
{key => value}
任何对象的位置key
和位置,或:value
{key: value}
Wherekey
是一个纯文字符号,并且value
是任何对象。此外,为了保持代码简洁,当您将 Hash 作为最后一个参数传递给方法时,您可以省略{
and,}
因为它是明确的。它最终为您提供了一个干净的“命名参数”样式方法调用:
do_something_to my_person, kindness: 10, aggressiveness: 2
在您的代码中:
connection :keyboard, adaptor: :keyboard
您有备用的哈希语法(符号键),{
以及}
离开。整条线100%相当于:
connection(:keyboard, {:adaptor => :keyboard})
你的最后一行:
device :keyboard, driver: :keyboard, connection: :keyboard
是一样的东西。相当于:
device(:keyboard, {:driver => :keyboard, :connection => :keyboard})
它只是看起来更好(一旦你习惯了)。