1

我正在寻找有关artoo.io机器人顶部发生了什么的解释。此示例顶部有一个使用键盘驱动程序的声明:

require 'artoo'

connection :keyboard, adaptor: :keyboard
device :keyboard, driver: :keyboard, connection: :keyboard

似乎显示了一些速记/替代语法,我很想解释一下这个速记。我了解替代哈希语法::adapter => :keyboard.

上面最后两行代码发生了什么?是什么connection?它是内部artoo正在初始化的类吗?为什么没有new?从哪里来:keyboard?如果有更明确地表示关系的替代语法,你能证明这一点吗?

4

2 回答 2

7

这是一个很好的问题。它可能是重复的,但我找不到,这对于刚接触 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})

它只是看起来更好(一旦你习惯了)。

于 2014-06-03T15:27:20.640 回答
2

在您的示例中,connection并且device是方法。,adapter: :keyboard和bits 是作为散列传递给这些方法的参数driver: :keyboard:connection: :keyboard传递给 connection() 和 device() 的第一个参数没有在散列中传递。

相同的代码可以这样重写:

connection :keyboard, { adaptor => :keyboard }
device :keyboard, { driver => :keyboard, connection => :keyboard }
于 2014-06-03T15:29:55.110 回答