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 使用简单的命名约定指明变量的作用域。
-
var 可能是局部变量
-
@var 是实例变量
-
$var 是全局变量`
这些符号能让程序员轻易识别变量的作用。此外,实例成员前面无需加上烦人的 self.。
- 更上层楼
Ruby 还有其他众多特性,下面列举一些:
-
Ruby 的异常处理特性与 Java 和 Python 类似,易于处理错误。
-
Ruby 拥有一个针对所有对象的标识-清扫(mark-and-sweep)式垃圾回收程序)。使用者无需维护扩展库中的引用计数。正如 Matz 所说:“这对您的健康有益。”
-
为 Ruby 写 C 扩展比 Perl 和 Python 容易,因为 Ruby 有一个非常雅致的 API,能从 C 语言中调用 Ruby。例如,调用软件中内嵌的 Ruby,当做脚本语言使用。此外,还有 SWIG 接口可用。
-
如果操作系统允许,Ruby 可以动态加载扩展库。
-
Ruby 提供不依赖操作系统的线程。所以,不管操作系统是否支持,Ruby 支持的所有操作系统都可以使用多线程,甚至是 MS-DOS!
-
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