我省略了什么

TryRuby 是一个面向初学者的 Ruby 课程。在 15 分钟内不可能告诉你关于 Ruby 的所有内容。以下是我省略的一些内容的概述。

注释

要向 Ruby 文件添加文本,可以使用注释。注释可用于文档、解释代码部分或任何其他你想要的内容。

单行注释

# A comment, this makes your code easier to read
x = 2 # comments can also be placed after a statement

多行注释

puts "Hello World"
=begin
This comment can span multiple lines. You denote the beginning and end of the
comment with the keywords =begin and =end at the start of separate newlines.
=end

Else-if

有一个 elsif 语句,你可以这样做

# elsif example
if a == 1
  do_thing1
elsif b == 2
  do_thing2
else
  do_thing3
end

Case

if-elsif-else 主题的变体。当你需要针对许多不同的值测试变量时很有用

# Case example 1
case a
when 1
  do_thing1
when 2
  do_thing2
when 3
  do_thing3
else
  do_thing4
end

还有一个替代形式

# Case example 2
case
when a == 1
  do_thing1
when b == 2
  do_thing2
when a >= 3
  do_thing3
else
  do_thing4
end

正则表达式

有时你有一个字符串,你想测试该字符串是否包含一些文本。例如,如果 'user_123' 以 'user_' 开头。你可以使用像 my_string[0..4] == 'user_' 这样的测试,但有一种更优雅、更灵活的方法来执行这种字符串测试,称为正则表达式。

原因是 TryRuby 课程中没有包含正则表达式,因为正则表达式的语法一开始非常奇怪,可能会让你头晕目眩。如果你第一次看到一个复杂的正则表达式,就像一只猴子在键盘上随机乱敲。

上面提到的示例的正则表达式相对简单

my_string.match( /^user_(\d+)/ )

如果 my_string 不符合正则表达式,则将返回 nil,如果符合,则返回 matchdata 对象。在最后一种情况下,它还会将 123 部分作为匹配数据提供。

Ruby 文档 对正则表达式有很好的解释。在谷歌上搜索 regex 会给你数百万个结果。

方法缺失

当你尝试在你的类上使用一个未定义的方法时,Ruby 会在你的类中查找 method_missing 方法。如果存在,method_missing 方法将被调用,并将你想要调用的方法的名称作为参数传递。

现在你可以像它存在一样处理缺失的方法。例如,你可能想要实现一个 sort_by_variable 方法。其中 variable 是你的类变量之一的名称。

检查

当程序运行时,Ruby 可以为你提供有关对象的许多信息。对象是什么以及它响应哪些方法。

# Inspection
s = 'abc'
puts s.class
puts s.methods
puts s.respond_to?(:match)

错误处理

现实情况是,所有程序都可能遇到错误。这些错误只有在程序运行时才会出现,即使你的代码完美无缺。这种情况也会发生。
你可以让你的程序崩溃,但通常情况下,让你的程序继续运行并礼貌地告知发生了错误,并且它无法继续执行正在进行的操作会更好。Ruby 为此提供了几个工具。

# Rescue
begin
  some_method_that_might_run_into_an_error
rescue => e
  puts "Error = #{e}"
end

有时你甚至可能希望你的程序引发错误(例如,当用户做了非常愚蠢的事情时)。

# Raise
raise "Yo dude seriously ? You can't enter zero for a divisor" if divisor == 0

IO

你经常需要读取或写入磁盘文件。在 Ruby 中这很容易。例如,可以使用 IO.Read 读取文件。

# Read a file
file_contents = IO.Read("my_file")

有关更多信息,请参阅文档。

太空船操作符

Ruby 支持这个奇怪的东西:<=>,称为太空船操作符。它根据左侧是否小于、等于或大于右侧返回 -1、0 或 1。这对于排序很有用。

  # Spaceship operator
  'a' <=> 'b'   => Returns -1

类继承

当你编写模拟某些现实生活情况的对象(类)时,你经常会遇到作为其他对象子集的对象。并且有许多这样的子集。这就是类继承派上用场的地方。

一个非常简单(且不完整)的例子

# Class inheritance
class Animal
  attr_reader :number_of_legs
end

class Cow < Animal
  #@number_of_legs = 4
end

class Chicken < Animal
  #@number_of_legs = 2
end

Cow 和 Chicken 类可以使用为 Animal 定义的所有属性和方法。

关于这个重要概念,你可以学习面向对象编程的课程或书籍。

实例变量

在我们的课程中,我们提到了对象变量。实际上,这些应该被称为实例变量,因为这些变量属于某个类型对象的单个实例。

模块和混入

有时你会有两个类,它们有许多相似的代码,但它们不能从一个共同的父类继承。为了避免在两个地方出现相同的代码(你应该尽量避免这种情况),你可以将公共代码放在一个模块中,并将该模块混入你的类中

或者你可以混入一个现有的模块,例如Enumerable

  # Mix-in
  class Blurbalizer
    include Enumerable

    attr_reader :blurbs

    def initialize
      @blurbs = []
    end

    def each(&block)
      @blurbs.each{ |blurb| block.call(blurb) }
    end
  end

  Blurbalizer.new.methods

只要你定义了方法 each,Enumerable 混入现在就可以免费提供许多方法,例如 map 和 sort。

元编程

与大多数其他语言不同,Ruby 允许你执行称为元编程的操作。这意味着 Ruby 程序可以在运行时改变自身。例如,你可以使用它从数据库中读取一个表,检查表的字段名,并创建一个方法来按名称访问每个字段。

垃圾回收

在你的代码中,你一直在使用变量。一些变量从头到尾使用,而另一些只使用很短的时间。例如,在方法内部创建的变量。但是,当你丢弃这些变量后,它们会去哪里?它们会神奇地消失吗?
不,这些变量以及相关的计算机内存将由垃圾回收器收集。

垃圾回收器会定期清理所有这些旧的、未使用的、不被使用的变量。这样就释放了相关的计算机内存,以便您的程序可以再次使用。

通常您不会注意到这种清理。除非您正在运行一些时间敏感的程序,比如游戏。每隔几秒钟,游戏就会出现一些卡顿。

导入 Ruby gem

在开始编写代码解决编程问题之前,最好先看看是否有人已经解决了相同的问题。 RubyGems 网站包含大量预制的 Ruby 代码。一定会有东西可以帮助您快速解决您的编码问题。gem 也非常容易安装。

DRY

这并不是一个 (Ruby) 技术,而是一个概念,DRY 代表 **D**on’t **R**epeat **Y**ourself。意思是:不要重复写相同的代码。
在编写代码时,您会经常发现需要编写一些与之前编写的代码相同或非常相似的代码。不要立即编写新的代码!!!
相反,找到现有的类似代码并将其提取到一个新方法中。从现有代码和您即将编写的代码中调用新方法。然后测试一切是否按预期工作。
这种编码方式的优点是您编写的代码更少,更容易维护。

简洁可读代码的代价

最后,Ruby 允许您编写非常简洁可读的代码。当然,这也有代价。
为了使代码简洁(= 短),您使用的函数需要能够执行很多强大的功能。这意味着必须有许多不同的函数,每个函数都以自己的方式强大。学习编写正确的 Ruby 代码意味着您必须了解很多不同的函数,这将花费相当长的时间。

其他编程语言可能只有一组简短的函数,学习起来更快,但在这些语言中制作一个真正的程序需要更多工作,因为您必须重新创建 Ruby 作为标准所知道的强大函数。