Ruby中的简写,Artoo.io

Que*_*lan 1 ruby syntax celluloid

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

require 'artoo'

connection :keyboard, adaptor: :keyboard
device :keyboard, driver: :keyboard, connection: :keyboard
Run Code Online (Sandbox Code Playgroud)

似乎显示了一些速记/替代语法,我喜欢这种简写的解释.我理解替代哈希语法::adapter => :keyboard.

上面最后两行代码中发生了什么?什么是connection?它是一个artoo正在初始化的类吗?为什么没有new?哪里:keyboard来的?如果有更明确地表示关系的替代语法,您是否也可以显示它?

gwc*_*fey 7

这是一个很好的问题.它可能是重复的,但是我找不到一个,对于不熟悉Ruby的聪明程序员来说,这是一件非常棘手的事情.

首先,问题是:什么是connection

这是一个方法调用.在某些情况下,很难说出什么是方法,什么是变量,因为它只取决于它们的定义方式.但在这种情况下很明显因为connection它后面有参数.在ruby中,可以像这样调用一个方法:

foo
Run Code Online (Sandbox Code Playgroud)

在这种情况下,它是一种不带参数的方法.或者它看起来像这样:

foo 1, 2, 3
Run Code Online (Sandbox Code Playgroud)

这是一个有三个参数的方法.或者它看起来像这样:

foo(1, 2, 3)
Run Code Online (Sandbox Code Playgroud)

这是相同的方法,但语法略有不同(这对于人们在c-mimicing语言中的经验比较熟悉,如c,C++,Java,Javascript,C#等......)

因此,当您看到在单词之后列出的参数之间没有运算符时,它肯定表示它是方法调用.

现在完全分解您的代码.

require 'artoo'
Run Code Online (Sandbox Code Playgroud)

这在技术上是一种方法调用.您正在调用该require方法并传递文字字符串的单个参数'artoo'.您可能知道,require将外部ruby文件加载到当前文件中.

connection :keyboard, adaptor: :keyboard
Run Code Online (Sandbox Code Playgroud)

这是一个带有一些语法糖的方法调用:

你知道这connection是一个方法调用,因为它后面有参数(即之间没有运算符connection和之后的运算符).但是什么参数?

:keyboard:是一个符号,它是ruby相当于一个实习字符串.

adaptor: :keyboard是一个哈希.

Ruby有两个主要的哈希语法:

{key => value}
Run Code Online (Sandbox Code Playgroud)

在哪里keyvalue是任何对象,或:

{key: value}
Run Code Online (Sandbox Code Playgroud)

哪个key是纯文字符号并且value是任何对象.另外,为了保持代码清洁,当您将Hash作为方法的最后一个参数传递时,您可以不使用它{,}因为它是明确的.它最终给你一个干净的"命名参数"样式方法调用:

do_something_to my_person, kindness: 10, aggressiveness: 2
Run Code Online (Sandbox Code Playgroud)

在你的代码中:

connection :keyboard, adaptor: :keyboard
Run Code Online (Sandbox Code Playgroud)

你有替换的哈希语法(符号键){}左关闭.整条线100%相当于:

connection(:keyboard, {:adaptor => :keyboard})
Run Code Online (Sandbox Code Playgroud)

你的最后一行:

device :keyboard, driver: :keyboard, connection: :keyboard
Run Code Online (Sandbox Code Playgroud)

是一回事.相当于:

device(:keyboard, {:driver => :keyboard, :connection => :keyboard})
Run Code Online (Sandbox Code Playgroud)

它看起来更好(一旦你习惯它).