Ruby on Rails 之旅(四)—— 学习一下Ruby的基本语法(2)

眉间皱痕 提交于 2020-03-12 19:45:40

用了半天的命令行,我快受不了了,赶快祭出我的Eclipse。

创建一个ruby工程。

然后创建一个ruby class。我参考的例子中把类名字叫ri20min.rb,可能是20分钟体验的意思吧。

名字无所谓,打开新创建的文件,我们会发现下面这些内容:

if __FILE__ == $0
end

__FILE__是一个“具有魔力”的变量,它代表了当前文件名。$0是用于启动程序的文件名。那么代码“if __FILE__ == $0”便意味着检查此文件是否为将被使用的主程序文件。这样做可以使程序文件作为代码库使用,而不是可执行代码;但当此文件被用作执行文件时,也可被执行。

名字无所谓,打开新创建的文件,我们会发现下面这些内容:

#!/usr/bin/env ruby

class MegaGreeter
  attr_accessor :names

  # 初始化这个物件
  def initialize(names = "World")
    @names = names
  end

  # 向每个人说 hi
  def say_hi
    if @names.nil?
      puts "..."
    elsif @names.respond_to?("each")

      # @names 是可以迭代的数组容器
      @names.each do |name|
        puts "Hello #{name}!"
      end
    else
      puts "Hello #{@names}!"
    end
  end

  # 向每个人说 bye
  def say_bye
    if @names.nil?
      puts "..."
    elsif @names.respond_to?("join")
      # 用逗号将数组中的元素串接成一个字符串
      puts "Goodbye #{@names.join(", ")}.  Come back soon!"
    else
      puts "Goodbye #{@names}.  Come back soon!"
    end
  end

end

if __FILE__ == $0
mg = MegaGreeter.new
  mg.say_hi
  mg.say_bye

  # 变更成 "Zeke"
  mg.names = "Zeke"
  mg.say_hi
  mg.say_bye

  # 变更成一个名字的数组
  mg.names = ["Albert", "Brenda", "Charles",
    "Dave", "Englebert"]
  mg.say_hi
  mg.say_bye

  # 变更成 nil
  mg.names = nil
  mg.say_hi
  mg.say_bye

end

控制台输出如下:

Hello World!
Goodbye World.  Come back soon!
Hello Zeke!
Goodbye Zeke.  Come back soon!
Hello Albert!
Hello Brenda!
Hello Charles!
Hello Dave!
Hello Englebert!
Goodbye Albert, Brenda, Charles, Dave, Englebert.  Come back soon!
...
...

程序中有一些对我来说是新的知识,自己记录一下学习过程:

#对于ruby来说是注释符号,但是对于文件顶部的#却有另外的含义:

 

Unix-like 操作系统下这告诉 Shell 如何执行这个档案。其余的批注则用来说明程序。

if @names.nil?

判断对象是否为空。

elsif @names.respond_to?("each")

判断@names是否为可以迭代的数组容器。这些语句简直堪称经典。

如果对象可以会用each方法,则表示你可以对他进行迭代,一边我们对其中的元素进行操作。

@names.each do |name|
        puts "Hello #{name}!"
      end

each是可以接受程序块的方法,对其中的每一个元素应用方法块。也就是do end之间的部分,是一个匿名方法,有点像lambda表达式。

两个|之间的部分就是匿名方法的参数,这个参数会被轮流指定为数组内的每一个元素,然后执行方法快。

这个对应java的索引循环for

elsif @names.respond_to?("join")
      # 用逗号将数组中的元素串接成一个字符串
      puts "Goodbye #{@names.join(", ")}.  Come back soon!"
    else
      puts "Goodbye #{@names}.  Come back soon!"
    end

这段代码就更闪光了。类似于上面的@names.respond_to?("each"),

say_bye 方法没有用到 each,而是检查 @names@ 是不是可以响应 join 方法。如果可以,就呼叫它。

不然它就把它当做字符串输出。这个方法并不在乎变量真正的型别(type),而只关心变量是不是可以响应支持某个方法,

这种风格叫做 “鸭子型别(Duck Typing)”,意义就是 “如果它走起来像鸭子,叫起来也像鸭子,那就当它是鸭子”。

这种思维的好处是它不会被变量的型别所限制。如果有人写了新的容器类别,并且也实作了 join 这个方法,

那么我们就可以在这里使用它。

是不是比java这种强类型检验灵活的多呢?

到这,初体验就差不多告一段落了,下一节来感受一下java与Ruby在语言上的异同。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!