机器学习实战-基于ruby(1)

发布时间 2023-07-11 15:28:42作者: 水宝石

ruby概述

想知道 Ruby 为什么会如此受欢迎吗?在粉丝眼中,Ruby 是一门优美而巧妙的语言,他们还认为 Ruby 易于使用,能解决实际问题。想知道受到这些赞誉的原因吗?

  • Ruby 发明者的理想

Ruby 是一个注重均衡的语言,它的发明者松本行弘(Yukihiro “Matz” Matsumoto),混合了他喜欢的多门语言(Perl、Smalltalk、Eiffel、Ada 和 Lisp),创造出了一种兼具函数式编程和命令式编程特色的新语言。

他常说,他是“试着让 Ruby 更自然,而不是更简单”,让一切符合生活常规。

除此之外,他还提到:

Ruby 就像人的身体一样,表面上看来简单,但是内部却相当复杂。1
  • Ruby 的成长

自从 1995 年公开发布以来,Ruby 在全球吸引了许多忠实的程序员。2006 年,Ruby 得到广泛接受,各大城市都有活跃的用户组,以及 Ruby 相关的开发者大会。

在主要的邮件列表 Ruby-Talk 中,讨论 Ruby 语言的消息攀升到每日 200 封。近几年,消息数量有所下降,因为社区在不断变大,由一个集中的邮件列表分成了很多小型的讨论组。

Ruby 经常位于全球编程语言成长和流行度指数的前十名(比如TIOBE)。造成 Ruby 如此快速成长的原因很大程度上是因为使用 Ruby 编写的 Web 框架 Ruby on Rails 非常受欢迎。

Ruby 完全免费,除了不收费之外,还可以自由使用、复制、修改和分发。

  • 把一切视为对象

最初,Matz 从其它语言中找寻理想的语法。回想他的研究,他说,“我想要一种比 Perl 更强大、比 Python 更面向对象的脚本语言”。2

在 Ruby 中,一切皆对象。所有的信息和代码都拥有属性和行为。面向对象编程称属性为实例变量(instance variables),称行为为方法(methods)。 从下列代码可以看出,Ruby 能给数字赋于行为,从这一点可以证明,Ruby 是纯面向对象的语言。

5.times { print "We *love* Ruby -- it's outrageous!" }

在许多语言中,数字和其它基本类型都不是对象。而 Ruby 受 Smalltalk 语言影响,所有类型都可以赋予方法和实例变量。这一点让 Ruby 特别易于使用,因为适用于对象的规则适用于 Ruby 中的一切。

  • Ruby 的灵活性

Ruby 是一门相当灵活的语言,允许用户改变自身。 Ruby 的核心部分可以更改,也可以重新定义。此外,还可以在现有功能的基础上增加新功能。Ruby 不想阻碍程序员的创造力。

比如,加号(+)是做加法的运算符。如果你更喜欢使用易读的 plus 的话,可以给 Ruby 内置的 Numeric 类添加一个函数。

class Numeric
  def plus(x)
    self.+(x)
  end
end

y = 5.plus 6

y 现在等于 11

Ruby 的运算符只是语法糖 (syntactic sugar),随时可以重定义。

  • 代码块:表现力强大的特性

Ruby 的代码块非常灵活。程序员可以给任何方法添加闭包,指明方法该如何工作。闭包也叫代码块,是从其他命令式语言(比如 PHP、Visual Basic 等)转到 Ruby 的初学者最喜欢使用的特性。

代码块取自函数式语言。Matz 说:“我希望在 Ruby 的闭包中融入 Lisp 的文化。”3

search_engines =
  %w[Google Yahoo MSN].map do |engine|
    "http://www." + engine.downcase + ".com"
  end

在上述代码中,代码块使用 do ... end 结构表述。map 方法把代码块应用到单词列表上。Ruby 中有很多方法都留出了切入点,让程序员编写代码块,控制方法具体的操作细节。

  • Ruby 中的混入

与其他面向对象语言不同,Ruby“有意”只提供单继承。不过 Ruby 有模块(在 Objective-C 中叫做类别)。模块是一系列方法。

类可以混入模块,得到模块中的所有方法。例如,所有实现 each 方法的类可以混入 Enumerable 模块,得到这个模块提供的所有方法,当然这些方法都会调用 each 做循环。

class MyArray
  include Enumerable
end

一般来说,Ruby 高手认为这种方式比多重继承更简洁。多重继承复杂,而且可能有太多限制。

  • Ruby 的视觉呈现

尽管 Ruby 只用很少的符号,而且偏向使用英文单词做关键字,但是也用一些符号装饰 Ruby。在 Ruby 中,不需要提前声明变量。Ruby 使用简单的命名约定指明变量的作用域。

  1. var 可能是局部变量
    
  2. @var 是实例变量
    
  3. $var 是全局变量`
    

这些符号能让程序员轻易识别变量的作用。此外,实例成员前面无需加上烦人的 self.。

  • 更上层楼

Ruby 还有其他众多特性,下面列举一些:

  1. Ruby 的异常处理特性与 Java 和 Python 类似,易于处理错误。
    
  2. Ruby 拥有一个针对所有对象的标识-清扫(mark-and-sweep)式垃圾回收程序)。使用者无需维护扩展库中的引用计数。正如 Matz 所说:“这对您的健康有益。”
    
  3. 为 Ruby 写 C 扩展比 Perl 和 Python 容易,因为 Ruby 有一个非常雅致的 API,能从 C 语言中调用 Ruby。例如,调用软件中内嵌的 Ruby,当做脚本语言使用。此外,还有 SWIG 接口可用。
    
  4. 如果操作系统允许,Ruby 可以动态加载扩展库。
    
  5. Ruby 提供不依赖操作系统的线程。所以,不管操作系统是否支持,Ruby 支持的所有操作系统都可以使用多线程,甚至是 MS-DOS!
    
  6. Ruby 高度可移植:它主要在 GNU/Linux 上开发,但也支持很多类型的 UNIX,以及 macOS,Windows,DOS,BeOS,OS/2 等。
    

numo-narray

Numo::NArray是一个数值N维数组类,用于快速处理和轻松操作多维数值数据,类似于numpy.ndaray。

apt install -y git ruby gcc ruby-dev rake make
gem install specific_install
gem specific_install https://github.com/ruby-numo/numo-narray.git

or

gem install numo-narray
[1] pry(main)> require "numo/narray"
=> true
[2] pry(main)> a = Numo::DFloat.new(3,5).seq
=> Numo::DFloat#shape=[3,5]
[[0, 1, 2, 3, 4],
 [5, 6, 7, 8, 9],
 [10, 11, 12, 13, 14]]
[3] pry(main)> a.shape
=> [3, 5]
[4] pry(main)> a.ndim
=> 2
[5] pry(main)> a.class
=> Numo::DFloat
[6] pry(main)> a.size
=> 15