fbpx
维基百科

Ruby

Ruby 是一种面向对象指令式函数式动态通用编程语言。在20世纪90年代中期由日本電腦科學家松本行弘(Matz)设计并开发。

Ruby
编程范型面向对象指令式函数式
設計者松本行弘
實作者松本行弘等人
发行时间1995年
目前版本
  • 3.2.2 (2023年3月30日;穩定版本)[1]
型態系統动态类型
操作系统跨平台
許可證Ruby许可证[2] / BSD许可证[3] / GNU通用公共许可证第二版[4]
網站www.ruby-lang.org
主要實作產品
Ruby MRI英语Ruby MRIYARVRubinius英语RubiniusMagLev英语MagLev (software)JRuby
MacRuby英语MacRubyRubyMotion英语RubyMotionHotRuby英语HotRubyIronRuby
mruby
啟發語言
Ada[5]C++[5]CLU[6]Dylan[6]Eiffel[5]
Lisp[6]Perl[6]Python[6]Smalltalk[6]
影響語言
ClojureD[7]ElixirFalconFancy英语Fancy (programming language)[8]Groovy
Ioke英语Ioke (programming language)[9]Mirah英语Mirah (programming language)Nu[10]Reia英语Reia (programming language)Potion英语Potion (programming language)

遵守BSD许可证和Ruby License[11][註 1]。它的灵感与特性来自于PerlSmalltalkEiffelAda以及Lisp语言。由Ruby语言本身还发展出了JRubyJava平台)、IronRuby.NET平台)等其他平台的Ruby语言替代品。

歷史

 
Ruby的作者松本行弘

Ruby的作者--松本行弘於1993年2月24日開始編寫Ruby,直至1995年12月才正式公開發佈於fj(新聞群組)。之所以稱為Ruby是取法自Perl,因為Perl的發音與6月的誕生石pearl(珍珠)相同,Ruby選擇以7月的誕生石ruby(紅寶石)命名。Ruby相較之下比其他類似的程式語言(如PerlPython)年輕,又因為Ruby是日本人發明的,所以早期的非日文資料和程式都比較貧乏,在網上仍然可以找到早期對Ruby的資料太少之類的批評。

約於2000年,Ruby開始進入美國,英文的資料開始發展。 2004年,Rails框架誕生,Ruby更加廣為人知,Ruby並於2006年為TIOBE獲選為年度程式語言。此時為Ruby的全盛時期。 這一時期許多 GitHub 上有創意的專案以 Ruby 撰寫,並且有 GitHub 與 Twitter 等重要網頁選用 Ruby 編寫。

2010年以後,JavascriptPython 這兩個和 Ruby 定位類似的語言在 Google 等公司與一些社群的支持下越來越受到歡迎。 其中,V8引擎使得 Javascript 在同類型語言中有著突出的效能; NumPyPython 可以更加優雅的進行科學運算。 2009年,以V8引擎製作的伺服端平台 Node.js 發表。 2015年 機器學習知名專案 TensorFlow 發表,並選用 Python 作為官方 API 使用的語言。 Ruby 在多年被蠶食後走向衰微。 Ruby 現在仍為TIOBE程式語言流行排行前20名,但已經遠遠沒有全盛時期受歡迎。

在 Ruby 逐漸失寵以後,開發團隊開始有意的提升 Ruby 的效能。在 Ruby 2.X 版本後期提出「Ruby 3x3」計畫[12],目標是希望 Ruby 3.0 版本能比 2.0 版本有 3 倍效能提升。 從 Ruby 3.0 開始,團隊開始嘗試在 Ruby 中加入 JIT 的功能。在 3.1 版本之後,Ruby 的團隊與 Shopify 團隊合作,嘗試性地加入新的 JIT 編譯器 —— YJIT。 並且 YJIT 在 Ruby 3.2 正式被引入[13]

Ruby的理念

减少编程时候的不必要的琐碎时间,令编写程序的人高兴,是设计Ruby语言的Matz的一个首要的考虑;其次是良好的界面设计。他强调系统设计必须强调人性化,而不是一味从机器的角度设想[14]

遵循着最小惊讶原则英语Principle of least astonishment,Ruby语言通常非常直观,按照编程人认为它应该的方式运行。

Ruby的作者認為Ruby > (Smalltalk + Perl) / 2[來源請求],表示Ruby是一個语法像Smalltalk一样完全面向对象、脚本執行、又有Perl強大的文字處理功能的程式語言。

Ruby的版本体系

Ruby版本号的构成形式是(MAJOR).(MINOR).(TEENY),均为只有1位的整数;如“1.8.6”、“1.9.3”。

1.9版系统的TEENY不小于1时为稳定版,TEENY为0的版本是开发版。在1.9之前的版本中偶数MINOR代表稳定版,奇数MINOR代表开发版。[15]

Ruby的Hello World程序

下面是一个在标准输出设备上输出Hello World的简单程序:

#!/usr/bin/env ruby puts "Hello, world!" 

或者是在irb互動式命令列的模式下:

>>puts "Hello, world!" Hello, world! => nil 

Ruby的特点

變數與函數的命名規則

乍看之下與Perl的命名規則有些類似,不過Perl的命名用來區分純量、陣列與映射;而Ruby的命名規則用來表示變數與類別的關係。Ruby的變數有以下幾種:

  • 一般小寫字母、底線開頭:變量(Variable)。
  • $開頭:全局變量(Global variable)。
  • @開頭:實例變量(Instance variable)。
  • @@開頭:類別變量(Class variable)類別变量被共享在整个继承链中
  • 大寫字母開頭:常數(Constant)。

有些函數則會加一個後綴,用來表示函數的用法,跟變數命名規則不同,函數的命名規則只是習慣,不具強制性,即使你不照規則命名也不影響程式運作

  • =結尾:赋值方法,相當於其他程式語言的set開頭的方法,算是一種語法糖
  • !結尾:破壞性方法,呼叫這個方法會修改本來的物件,這種方法通常有個非破壞性的版本,呼叫非破壞性的版本會回傳一個物件的副本。
  • ?結尾:表示這個函數的回傳值是個布林值。

多種字串表示法

Ruby提供了多種字串的表示方法,方便撰寫有大量文字資料的程式。除了来自C语言的引号表示法之外,还有来自于Perl的百分号字面量记法,以及方便书写大量内容的Heredoc记法。Ruby可以方便地以#{variable_name}的方式向字符串中插入变量。

a = '\n这是一个单引号的字符串,反斜线和变量插值不会被转义' b = %q{这是一个不可转义的字符串} c = "\n这是一个双引号的字符串,反斜线和变量插值会被转义\n#{a}" d = %Q{\n這是一個常量字串,特殊内容同样会被转义\n} e = <<BLOCK 这是一个以Heredoc方式书写的常量字符串,可转义,结尾标志不可缩进 BLOCK f = <<-BLOCK  这是一个可以缩进的Heredoc字符串  BLOCK g = <<~BLOCK  这是一个可以缩进的Heredoc字符串  缩进会被自动去掉,在2.3版本中引入  BLOCK h = %/\t这是一个可转义的的字符串\n/ 

動態修改物件、類別

Ruby是动态语言,你可以在程序中修改先前定义过的類別。 也可以在某个类別的实例中定义该实例特有的方法,这叫做原型方法(prototype)。

class MyClass  def the_method  "general method"  end end mc = MyClass.new def mc.the_method  "special for this instance." end mc.the_method 

強大的反射機制與元編程

Ruby的反射功能相當驚人,甚至可以自行追蹤程式運作,或是取出private變數、攔截方法的呼叫。 常常與『可以動態的修改物件』這項特色結合,做為『元編程』的功能:程式在運行時, 可以由程式設計師提供的資訊,自行生成、修改類別或物件,這項功能大大的提高了撰寫程式碼的效率。 在Rails之中,就大量使用了這種特性。

以下為用Rails使用元編程的範例:

class Project < ActiveRecord::Base  belongs_to :portfolio  has_one :project_manager  has_many :milestones end 

在這個例子中,Project類別繼承Base類別,Base類別內建的belongs_tohas_onehas_many方法,便會根據參數來修改Project類別的內容,並自行建立其他相關的方法。程式設計師可以更專心處理程式的運作,而不必為每個類別重複得撰寫程式碼。

豐富靈活的迴圈表示

# 使用 for,在 1 到 3 取出值 1、2、3 到 outer_i 裡操作。 for outer_i in 1..3 do  puts "for: #{outer_i * 100}" end # 在 1 到 3 的集合裡針對每個值,放到 i 裡操作。 (1..3).each do |i|  puts "each: #{i * 100}" end # 只要符合 outer_i 小於等於 300,則進入迴圈。 outer_i = 100 while outer_i <= 300  puts "while: #{outer_i}"  outer_i += 100 end # 直到 outer_i 大於 300 前,都可以進入迴圈。 outer_i = 100 until outer_i > 300  puts "until: #{outer_i}"  outer_i += 100 end # 無限迴圈,用 break 來打斷迴圈。 outer_i = 100 loop do  break if outer_i > 300  puts "loop: #{outer_i}"  outer_i += 100 end # 作 3 次迴圈,i 從 0 開始遞增 1。 3.times do |i|  puts "times: #{(i + 1) * 100}" end # 從 1 遞增 1 到 3,值傳入 i 來操作。 1.upto(3) do |i|  puts "upto: #{i * 100}" end # 從 3 遞減 1 到 1,值傳入 i 來操作。 3.downto(1) do |i|  puts "downto: #{400 - i * 100}" end # 從 100 開始以每步 +100 邁向 300。 100.step(300, 100) do |i|  puts "step: #{i}" end 

其他特色

  • 完全物件導向:任何東西都是物件,沒有基礎型別
  • 變數是動態类型
  • 任何東西都有值:不管是四則運算、邏輯表達式還是一個語句,都有回傳值。
  • 运算符重载
  • 垃圾回收
  • 强类型[16]
  • 变量无需声明
  • Windows上,載入DLL

比較與批評

讓人意外之處

  • 在Ruby中,只有falsenil表示false,其它的所有值都表示true(包括00.0""[][17]。這點和C語言的『用0代表false』不同。
  • Ruby的字串是可改變的,這與Java固定不變的字串不同。在Ruby中,常用Symbol对象来表示不可变的字符串。Ruby 2.3提供了默认冻结字符串的选项,在源码开头添加魔术注释# frozen_string_literal: true可以打开这个选项,当用户试图更改String对象时会抛出运行时异常。同时,松本行弘表示,在Ruby 3中,字符串将是默认不可变的。[18]
  • Ruby的繼承功能相當脆弱,儘管Ruby是一個物件導向語言,Ruby內的許多規則,卻使得子類別有可能不小心就覆寫了父類別的功能,在《The Ruby Programming Language》一書中,建議除非程式設計師對一個類別相當了解,否則盡可能不要使用繼承。

和Perl 6比較

  • CPAN上排名第一名,同時也是Perl 6的開發者的唐鳳(Autrijus / Audrey)說:「Ruby就是『沒有到處打廣告的Perl 6』」。[19][20]
  • 松本行弘在接受歐萊禮(O'Reilly)訪問時,提到「Ruby借用了很多Perl的東西……,Python遠比Perl要少……」、「我認為Ruby這個名字作為Perl之後的一門語言的名字真是再恰當不過了。」[21]
  • Perl之父拉里·沃爾(Larry Wall)說:「很多方面上我還是很喜歡Ruby的,這是因為那些部分是從Perl借過去的。:-)」、「我還喜歡Ruby的C<*>一元星號操作符,所以我把它加到Perl 6裡面。」[22]

程式範例

下面的代码可以在Ruby shell中运行,比如irb互動式命令列,或者保存为文件并运行命令ruby <filename>

  • 一些基本的Ruby代码:
# Everything, including a literal, is an object, so this works: -199.abs # 199 "ruby is cool".length # 12 "Rick Astley".index("c") # 2 "Never gonna let you down".sub('let you down', 'give you up') # "Never gonna give you up" "Nice Day Isn't It?".downcase.split(//).sort.uniq.join # " '?acdeinsty" 
  • 一些转换:
puts "What's your favorite number?" number = gets.chomp outputnumber = number.to_i + 1 puts outputnumber.to_s + ' is a bigger and better favorite number.' 

集合

a = [1,'hi', 3.14, 1, 2, [4, 5]] p a[2] # 3.14 p a.[](2)# 3.14 p a.reverse # [[4, 5], 2, 1, 3.14, 'hi', 1] p a.flatten.uniq # [1, 'hi', 3.14, 2, 4, 5] 
  • 构造和使用关联数组:
hash = { :water => 'wet', :fire => 'hot' } puts hash[:fire] # Prints: hot hash.each_pair do |key, value| # Or: hash.each do |key, value| puts "#{key} is #{value}" end # Prints: water is wet # fire is hot hash.delete :water # Deletes :water => 'wet' hash.delete_if {|k,value| value=='hot'} # Deletes :fire => 'hot' 

块和迭代器

  • 有两个语法用于创建块:
{ puts "Hello, World!" } # Note the { braces } #or do puts "Hello, World!" end 
  • 传参数的块使用闭包Closure
# In an object instance variable (denoted with '@'), remember a block. def remember(&a_block)  @block = a_block end # Invoke the above method, giving it a block which takes a name. remember {|name| puts "Hello, #{name}!"} # When the time is right (for the object) -- call the closure! @block.call("Jon") # => "Hello, Jon!" 
  • 从方法中返回闭包:
def create_set_and_get(initial_value=0) # Note the default value of 0  closure_value = initial_value  return Proc.new {|x| closure_value = x}, Proc.new { puts closure_value } end setter, getter = create_set_and_get # ie. returns two values setter.call(21) getter.call # => 21 
  • 迭代调用调用时提供的块:
def use_hello  yield "hello" end # Invoke the above method, passing it a block. use_hello {|string| puts string} # => 'hello' 
  • 使用块迭代数组:
array = [1, 'hi', 3.14] array.each { |item| puts item } # => 1 # => 'hi' # => 3.14 array.each_index { |index| puts "#{index}: #{array[index]}" } # => 0: 1 # => 1: 'hi' # => 2: 3.14 (3..6).each { |num| puts num } # => 3 # => 4 # => 5 # => 6 

像inject()方法可以接收一个参数和一个块。迭代的注入列表的每一个成员,执行函数时保存总和。这同函数编程语言中的foldl函数相类似,比如:

[1,3,5].inject(10) {|sum, element| sum + element} # => 19 

首先块接收到了10(inject的参数)当作变量sum,并且1(数组的第一个元素)当作变量element;这会返回11。11又被当作下一步的sum变量,它加上3得到了14。14又被加上了5,最终返回结果19。

  • 块运行在内置的方法中:
File.open('file.txt', 'w') do |file| # 'w' denotes "write mode".  file.puts 'Wrote some text.' end # File is automatically closed here File.readlines('file.txt').each do |line| puts line end # => Wrote some text. 
  • 使用枚举器和块求1到10的平方:
(1..10).collect {|x| x*x} # => [1, 4, 9, 16, 25, 36, 49, 64, 81, 100] 

下面的代码定义一个命名为Person的类。含有一个「initialize」方法,用于构选创建一个新对象,它还有两个方法,一个重载了<=>比较运算符(这样Array#sort可以使用age排序)另一个重载了to_s方法(这样Kernel#puts可以格式化输出),attr_reader是Ruby中元数据编程的例子:attr_accessor为实例变量定义了getter和setter方法,attr_reader只是一个getter方法。另外,方法中最后的声明是它的返回值,也允许显式的使用「return」语句。

class Person  attr_reader :name, :age  def initialize(name, age)  @name, @age = name, age  end  def <=>(person) # Comparison operator for sorting  @age <=> person.age  end  def to_s  "#@name (#@age)"  end end group = [  Person.new("Bob", 33),  Person.new("Chris", 16),  Person.new("Ash", 23) ] puts group.sort.reverse 
  • 下面按age倒序输出了三个名字:
Bob(33) Ash(23) Chris(16) 

各種版本

Matz's Ruby interpreter, 最初也是最常見的Ruby版本, 簡稱MRI, 用C語言撰寫.

JRuby,類似PythonJython,一個可於Java上執行Ruby的語言,支援Java的介面和類別。最新發布版爲9.1.6.0(2016-11-09),與Ruby 2.3兼容。它的官方網站為。

mruby是一个轻量级的Ruby解释器,可以嵌入到其它应用程序中,或者作为库链接到应用中。

參見

注释

  1. ^ Ruby早期遵守GPL協議。

参考文献

  1. ^ Ruby 3.2.2 Released. 2023年3月30日 [2023年3月30日]. 
  2. ^ COPYING in Ruby official source repository. [2013-10-30]. (原始内容于2017-03-20). 
  3. ^ . [2013-10-30]. (原始内容存档于2022-03-21). 
  4. ^ . [2 May 2015]. (原始内容存档于2022-03-21). 
  5. ^ 5.0 5.1 5.2 Cooper, Peter. Beginning Ruby: From Novice to Professional. Beginning from Novice to Professional 2nd. Berkeley: APress. 2009: 101. ISBN 1-4302-2363-4. To a lesser extent, Python, LISP, Eiffel, Ada, and C++ have also influenced Ruby. 
  6. ^ 6.0 6.1 6.2 6.3 6.4 6.5 Bini, Ola. Practical JRuby on Rails Web 2.0 Projects: Bringing Ruby on Rails to Java. Berkeley: APress. 2007: 3. ISBN 1-59059-881-4. It draws primarily on features from Perl, Smalltalk, Python, Lisp, Dylan, and CLU. 
  7. ^ Intro – D Programming Language 1.0 – Digital Mars. [2013-10-30]. (原始内容于2018-12-25). 
  8. ^ Bertels, Christopher. Introduction to Fancy. Rubinius blog. Engine Yard. 23 February 2011 [2011-07-21]. (原始内容于2018-12-25). 
  9. ^ Bini, Ola. . Ioke.org. [2011-07-21]. (原始内容存档于2011-07-21). inspired by Io, Smalltalk, Lisp and Ruby 
  10. ^ Burks, Tim. . Programming Nu™. Neon Design Technology, Inc. [2011-07-21]. (原始内容存档于2011-07-24). 
  11. ^ Ruby License. [2004-09-25]. (原始内容存档于2011-08-22). 
  12. ^ Ruby 2.6正式版釋出主打JIT,但卻會造成Rails效能下降. iThome. [2023-06-13]. (原始内容于2022-05-21) (中文(繁體)). 
  13. ^ Shopify開發團隊公開以Rust重寫Ruby YJIT的權衡與改進細節. iThome. [2023-06-13]. (原始内容于2023-01-22) (中文(繁體)). 
  14. ^ . [2007-09-17]. (原始内容存档于2019-07-05). 
  15. ^ [Ruby语言入门东南大学出版社2010年4月第一版P19]
  16. ^ . [2010-10-26]. (原始内容存档于2022-02-22). 
  17. ^ To Ruby From Python (页面存档备份,存于互联网档案馆),When tested for truth, only false and nil evaluate to a false value. Everything else is true (including 0, 0.0, "", and []).
  18. ^ . [2017-11-27]. (原始内容存档于2022-04-15). 
  19. ^ Perl 6於2019年10月更名為Raku
  20. ^ . [2013-10-22]. (原始内容存档于2015-09-24). 
  21. ^ O'Reilly訪問Matz。. [2007-07-20]. (原始内容于2009-07-28). 
  22. ^ Larry Wall On Perl, Religion, and……. [2007-07-20]. (原始内容于2007-07-29). 
  23. ^ . [2007-07-23]. (原始内容存档于2012-11-20). 

外部連結

  • Ruby的官方网站(页面存档备份,存于互联网档案馆
  • 提供一個類似SourceForge和Freshmeat的環境給用Ruby或給Ruby寫的工具,現已停止運營。
  • Full Ruby on Rails Tutorial
  • TryRuby(页面存档备份,存于互联网档案馆(英文)
  • Ruby Taiwan社群 (页面存档备份,存于互联网档案馆
  • Ruby中国社区 (页面存档备份,存于互联网档案馆)目前中国Ruby开发者公认的Ruby中文社区。
  • 微服务架构在Ruby中[失效連結](英文)

ruby, 此條目介紹的是程式語言, 关于寶石類的, 请见, 紅寶石, 关于印刷用語字元, 请见, 旁註標記, 是一种面向对象, 指令式, 函数式, 动态的通用编程语言, 在20世纪90年代中期由日本電腦科學家松本行弘, matz, 设计并开发, 编程范型面向对象, 指令式, 函数式設計者松本行弘實作者松本行弘等人发行时间1995年目前版本3, 2023年3月30日, 穩定版本, 型態系統动态类型操作系统跨平台許可證许可证, bsd许可证, gnu通用公共许可证第二版, 網站www, ruby, lang, org. 此條目介紹的是程式語言Ruby 关于寶石類的Ruby 请见 紅寶石 关于印刷用語Ruby字元 请见 旁註標記 Ruby 是一种面向对象 指令式 函数式 动态的通用编程语言 在20世纪90年代中期由日本電腦科學家松本行弘 Matz 设计并开发 Ruby编程范型面向对象 指令式 函数式設計者松本行弘實作者松本行弘等人发行时间1995年目前版本3 2 2 2023年3月30日 穩定版本 1 型態系統动态类型操作系统跨平台許可證Ruby许可证 2 BSD许可证 3 GNU通用公共许可证第二版 4 網站www wbr ruby lang wbr org主要實作產品Ruby MRI 英语 Ruby MRI YARV Rubinius 英语 Rubinius MagLev 英语 MagLev software JRuby MacRuby 英语 MacRuby RubyMotion 英语 RubyMotion HotRuby 英语 HotRuby IronRuby mruby啟發語言Ada 5 C 5 CLU 6 Dylan 6 Eiffel 5 Lisp 6 Perl 6 Python 6 Smalltalk 6 影響語言Clojure D 7 Elixir Falcon Fancy 英语 Fancy programming language 8 Groovy Ioke 英语 Ioke programming language 9 Mirah 英语 Mirah programming language Nu 10 Reia 英语 Reia programming language Potion 英语 Potion programming language 遵守BSD许可证和Ruby License 11 註 1 它的灵感与特性来自于Perl Smalltalk Eiffel Ada以及Lisp语言 由Ruby语言本身还发展出了JRuby Java平台 IronRuby NET平台 等其他平台的Ruby语言替代品 目录 1 歷史 2 Ruby的理念 3 Ruby的版本体系 4 Ruby的Hello World程序 5 Ruby的特点 5 1 變數與函數的命名規則 5 2 多種字串表示法 5 3 動態修改物件 類別 5 4 強大的反射機制與元編程 5 5 豐富靈活的迴圈表示 5 6 其他特色 6 比較與批評 6 1 讓人意外之處 6 2 和Perl 6比較 7 程式範例 7 1 集合 7 2 块和迭代器 7 3 类 8 各種版本 9 參見 10 注释 11 参考文献 12 外部連結歷史 编辑 Ruby的作者松本行弘 Ruby的作者 松本行弘於1993年2月24日開始編寫Ruby 直至1995年12月才正式公開發佈於fj 新聞群組 之所以稱為Ruby是取法自Perl 因為Perl的發音與6月的誕生石pearl 珍珠 相同 Ruby選擇以7月的誕生石ruby 紅寶石 命名 Ruby相較之下比其他類似的程式語言 如Perl或Python 年輕 又因為Ruby是日本人發明的 所以早期的非日文資料和程式都比較貧乏 在網上仍然可以找到早期對Ruby的資料太少之類的批評 約於2000年 Ruby開始進入美國 英文的資料開始發展 2004年 Rails框架誕生 Ruby更加廣為人知 Ruby並於2006年為TIOBE獲選為年度程式語言 此時為Ruby的全盛時期 這一時期許多 GitHub 上有創意的專案以 Ruby 撰寫 並且有 GitHub 與 Twitter 等重要網頁選用 Ruby 編寫 2010年以後 Javascript 和 Python 這兩個和 Ruby 定位類似的語言在 Google 等公司與一些社群的支持下越來越受到歡迎 其中 V8引擎使得 Javascript 在同類型語言中有著突出的效能 NumPy 讓 Python 可以更加優雅的進行科學運算 2009年 以V8引擎製作的伺服端平台 Node js 發表 2015年 機器學習知名專案 TensorFlow 發表 並選用 Python 作為官方 API 使用的語言 Ruby 在多年被蠶食後走向衰微 Ruby 現在仍為TIOBE程式語言流行排行前20名 但已經遠遠沒有全盛時期受歡迎 在 Ruby 逐漸失寵以後 開發團隊開始有意的提升 Ruby 的效能 在 Ruby 2 X 版本後期提出 Ruby 3x3 計畫 12 目標是希望 Ruby 3 0 版本能比 2 0 版本有 3 倍效能提升 從 Ruby 3 0 開始 團隊開始嘗試在 Ruby 中加入 JIT 的功能 在 3 1 版本之後 Ruby 的團隊與 Shopify 團隊合作 嘗試性地加入新的 JIT 編譯器 YJIT 並且 YJIT 在 Ruby 3 2 正式被引入 13 Ruby的理念 编辑减少编程时候的不必要的琐碎时间 令编写程序的人高兴 是设计Ruby语言的Matz的一个首要的考虑 其次是良好的界面设计 他强调系统设计必须强调人性化 而不是一味从机器的角度设想 14 人们特别是电脑工程师们 常常从机器着想 他们认为 这样做 机器就能运行的更快 这样做 机器运行效率更高 这样做 机器就会怎样怎样怎样 实际上 我们需要从人的角度考虑问题 人们怎样编写程序或者怎样使用机器上应用程序 我们是主人 他们是仆人 遵循着最小惊讶原则 英语 Principle of least astonishment Ruby语言通常非常直观 按照编程人认为它应该的方式运行 Ruby的作者認為Ruby gt Smalltalk Perl 2 來源請求 表示Ruby是一個语法像Smalltalk一样完全面向对象 脚本執行 又有Perl強大的文字處理功能的程式語言 Ruby的版本体系 编辑Ruby版本号的构成形式是 MAJOR MINOR TEENY 均为只有1位的整数 如 1 8 6 1 9 3 1 9版系统的TEENY不小于1时为稳定版 TEENY为0的版本是开发版 在1 9之前的版本中偶数MINOR代表稳定版 奇数MINOR代表开发版 15 Ruby的Hello World程序 编辑下面是一个在标准输出设备上输出Hello World的简单程序 usr bin env ruby puts Hello world 或者是在irb互動式命令列的模式下 gt gt puts Hello world Hello world gt nilRuby的特点 编辑變數與函數的命名規則 编辑 乍看之下與Perl的命名規則有些類似 不過Perl的命名用來區分純量 陣列與映射 而Ruby的命名規則用來表示變數與類別的關係 Ruby的變數有以下幾種 一般小寫字母 底線開頭 變量 Variable 開頭 全局變量 Global variable 開頭 實例變量 Instance variable 開頭 類別變量 Class variable 類別变量被共享在整个继承链中 大寫字母開頭 常數 Constant 有些函數則會加一個後綴 用來表示函數的用法 跟變數命名規則不同 函數的命名規則只是習慣 不具強制性 即使你不照規則命名也不影響程式運作 結尾 赋值方法 相當於其他程式語言的set開頭的方法 算是一種語法糖 結尾 破壞性方法 呼叫這個方法會修改本來的物件 這種方法通常有個非破壞性的版本 呼叫非破壞性的版本會回傳一個物件的副本 結尾 表示這個函數的回傳值是個布林值 多種字串表示法 编辑 Ruby提供了多種字串的表示方法 方便撰寫有大量文字資料的程式 除了来自C语言的引号表示法之外 还有来自于Perl的百分号字面量记法 以及方便书写大量内容的Heredoc记法 Ruby可以方便地以 variable name 的方式向字符串中插入变量 a n 这是一个单引号的字符串 反斜线和变量插值不会被转义 b q 这是一个不可转义的字符串 c n 这是一个双引号的字符串 反斜线和变量插值会被转义 n a d Q n 這是一個常量字串 特殊内容同样会被转义 n e lt lt BLOCK 这是一个以Heredoc方式书写的常量字符串 可转义 结尾标志不可缩进 BLOCK f lt lt BLOCK 这是一个可以缩进的Heredoc字符串 BLOCK g lt lt BLOCK 这是一个可以缩进的Heredoc字符串 缩进会被自动去掉 在2 3版本中引入 BLOCK h t这是一个可转义的的字符串 n 動態修改物件 類別 编辑 Ruby是动态语言 你可以在程序中修改先前定义过的類別 也可以在某个类別的实例中定义该实例特有的方法 这叫做原型方法 prototype class MyClass def the method general method end end mc MyClass new def mc the method special for this instance end mc the method 強大的反射機制與元編程 编辑 Ruby的反射功能相當驚人 甚至可以自行追蹤程式運作 或是取出private變數 攔截方法的呼叫 常常與 可以動態的修改物件 這項特色結合 做為 元編程 的功能 程式在運行時 可以由程式設計師提供的資訊 自行生成 修改類別或物件 這項功能大大的提高了撰寫程式碼的效率 在Rails之中 就大量使用了這種特性 以下為用Rails使用元編程的範例 class Project lt ActiveRecord Base belongs to portfolio has one project manager has many milestones end 在這個例子中 Project類別繼承Base類別 Base類別內建的belongs to has one has many方法 便會根據參數來修改Project類別的內容 並自行建立其他相關的方法 程式設計師可以更專心處理程式的運作 而不必為每個類別重複得撰寫程式碼 豐富靈活的迴圈表示 编辑 使用 for 在 1 到 3 取出值 1 2 3 到 outer i 裡操作 for outer i in 1 3 do puts for outer i 100 end 在 1 到 3 的集合裡針對每個值 放到 i 裡操作 1 3 each do i puts each i 100 end 只要符合 outer i 小於等於 300 則進入迴圈 outer i 100 while outer i lt 300 puts while outer i outer i 100 end 直到 outer i 大於 300 前 都可以進入迴圈 outer i 100 until outer i gt 300 puts until outer i outer i 100 end 無限迴圈 用 break 來打斷迴圈 outer i 100 loop do break if outer i gt 300 puts loop outer i outer i 100 end 作 3 次迴圈 i 從 0 開始遞增 1 3 times do i puts times i 1 100 end 從 1 遞增 1 到 3 值傳入 i 來操作 1 upto 3 do i puts upto i 100 end 從 3 遞減 1 到 1 值傳入 i 來操作 3 downto 1 do i puts downto 400 i 100 end 從 100 開始以每步 100 邁向 300 100 step 300 100 do i puts step i end 其他特色 编辑 完全物件導向 任何東西都是物件 沒有基礎型別 變數是動態类型 任何東西都有值 不管是四則運算 邏輯表達式還是一個語句 都有回傳值 运算符重载 垃圾回收 强类型 16 变量无需声明 在Windows上 載入DLL比較與批評 编辑讓人意外之處 编辑 在Ruby中 只有false和nil表示false 其它的所有值都表示true 包括0 0 0 17 這點和C語言的 用0代表false 不同 Ruby的字串是可改變的 這與Java固定不變的字串不同 在Ruby中 常用Symbol对象来表示不可变的字符串 Ruby 2 3提供了默认冻结字符串的选项 在源码开头添加魔术注释 frozen string literal true可以打开这个选项 当用户试图更改String对象时会抛出运行时异常 同时 松本行弘表示 在Ruby 3中 字符串将是默认不可变的 18 Ruby的繼承功能相當脆弱 儘管Ruby是一個物件導向語言 Ruby內的許多規則 卻使得子類別有可能不小心就覆寫了父類別的功能 在 The Ruby Programming Language 一書中 建議除非程式設計師對一個類別相當了解 否則盡可能不要使用繼承 和Perl 6比較 编辑 CPAN上排名第一名 同時也是Perl 6的開發者的唐鳳 Autrijus Audrey 說 Ruby就是 沒有到處打廣告的Perl 6 19 20 松本行弘在接受歐萊禮 O Reilly 訪問時 提到 Ruby借用了很多Perl的東西 Python遠比Perl要少 我認為Ruby這個名字作為Perl之後的一門語言的名字真是再恰當不過了 21 Perl之父拉里 沃爾 Larry Wall 說 很多方面上我還是很喜歡Ruby的 這是因為那些部分是從Perl借過去的 我還喜歡Ruby的C lt gt 一元星號操作符 所以我把它加到Perl 6裡面 22 程式範例 编辑此條目包含指南或教學內容 請藉由移除或重寫指南段落來改善條目 或在討論頁提出討論 下面的代码可以在Ruby shell中运行 比如irb互動式命令列 或者保存为文件并运行命令ruby lt filename gt 一些基本的Ruby代码 Everything including a literal is an object so this works 199 abs 199 ruby is cool length 12 Rick Astley index c 2 Never gonna let you down sub let you down give you up Never gonna give you up Nice Day Isn t It downcase split sort uniq join acdeinsty 一些转换 puts What s your favorite number number gets chomp outputnumber number to i 1 puts outputnumber to s is a bigger and better favorite number 集合 编辑 构造和使用数组 a 1 hi 3 14 1 2 4 5 p a 2 3 14 p a 2 3 14 p a reverse 4 5 2 1 3 14 hi 1 p a flatten uniq 1 hi 3 14 2 4 5 构造和使用关联数组 hash water gt wet fire gt hot puts hash fire Prints hot hash each pair do key value Or hash each do key value puts key is value end Prints water is wet fire is hot hash delete water Deletes water gt wet hash delete if k value value hot Deletes fire gt hot 块和迭代器 编辑 有两个语法用于创建块 puts Hello World Note the braces or do puts Hello World end 传参数的块使用闭包Closure In an object instance variable denoted with remember a block def remember amp a block block a block end Invoke the above method giving it a block which takes a name remember name puts Hello name When the time is right for the object call the closure block call Jon gt Hello Jon 从方法中返回闭包 def create set and get initial value 0 Note the default value of 0 closure value initial value return Proc new x closure value x Proc new puts closure value end setter getter create set and get ie returns two values setter call 21 getter call gt 21 迭代调用调用时提供的块 def use hello yield hello end Invoke the above method passing it a block use hello string puts string gt hello 使用块迭代数组 array 1 hi 3 14 array each item puts item gt 1 gt hi gt 3 14 array each index index puts index array index gt 0 1 gt 1 hi gt 2 3 14 3 6 each num puts num gt 3 gt 4 gt 5 gt 6 像inject 方法可以接收一个参数和一个块 迭代的注入列表的每一个成员 执行函数时保存总和 这同函数编程语言中的foldl函数相类似 比如 1 3 5 inject 10 sum element sum element gt 19 首先块接收到了10 inject的参数 当作变量sum 并且1 数组的第一个元素 当作变量element 这会返回11 11又被当作下一步的sum变量 它加上3得到了14 14又被加上了5 最终返回结果19 块运行在内置的方法中 File open file txt w do file w denotes write mode file puts Wrote some text end File is automatically closed here File readlines file txt each do line puts line end gt Wrote some text 使用枚举器和块求1到10的平方 1 10 collect x x x gt 1 4 9 16 25 36 49 64 81 100 类 编辑 下面的代码定义一个命名为Person的类 含有一个 initialize 方法 用于构选创建一个新对象 它还有两个方法 一个重载了 lt gt 比较运算符 这样Array sort可以使用age排序 另一个重载了to s方法 这样Kernel puts可以格式化输出 attr reader是Ruby中元数据编程的例子 attr accessor为实例变量定义了getter和setter方法 attr reader只是一个getter方法 另外 方法中最后的声明是它的返回值 也允许显式的使用 return 语句 class Person attr reader name age def initialize name age name age name age end def lt gt person Comparison operator for sorting age lt gt person age end def to s name age end end group Person new Bob 33 Person new Chris 16 Person new Ash 23 puts group sort reverse 下面按age倒序输出了三个名字 Bob 33 Ash 23 Chris 16 各種版本 编辑Matz s Ruby interpreter 最初也是最常見的Ruby版本 簡稱MRI 用C語言撰寫 JRuby 類似Python的Jython 一個可於Java上執行Ruby的語言 支援Java的介面和類別 最新發布版爲9 1 6 0 2016 11 09 與Ruby 2 3兼容 它的官方網站為jruby org mruby是一个轻量级的Ruby解释器 可以嵌入到其它应用程序中 或者作为库链接到应用中 參見 编辑Python 經常和Ruby比較 23 Perl Perl 6 vs Ruby QtRuby Qt的Ruby綁定 Smalltalk Ruby on Rails 一个MVC的快速網站开发应用框架 RGSS 使用Ruby為基礎的遊戲腳本系統 注释 编辑 Ruby早期遵守GPL協議 参考文献 编辑 Ruby 3 2 2 Released 2023年3月30日 2023年3月30日 COPYING in Ruby official source repository 2013 10 30 原始内容存档于2017 03 20 BSDL in Ruby official source repository 2013 10 30 原始内容存档于2022 03 21 Contents of trunk GPL 2 May 2015 原始内容存档于2022 03 21 5 0 5 1 5 2 Cooper Peter Beginning Ruby From Novice to Professional Beginning from Novice to Professional 2nd Berkeley APress 2009 101 ISBN 1 4302 2363 4 To a lesser extent Python LISP Eiffel Ada and C have also influenced Ruby 6 0 6 1 6 2 6 3 6 4 6 5 Bini Ola Practical JRuby on Rails Web 2 0 Projects Bringing Ruby on Rails to Java Berkeley APress 2007 3 ISBN 1 59059 881 4 It draws primarily on features from Perl Smalltalk Python Lisp Dylan and CLU Intro D Programming Language 1 0 Digital Mars 2013 10 30 原始内容存档于2018 12 25 Bertels Christopher Introduction to Fancy Rubinius blog Engine Yard 23 February 2011 2011 07 21 原始内容存档于2018 12 25 Bini Ola Ioke Ioke org 2011 07 21 原始内容存档于2011 07 21 inspired by Io Smalltalk Lisp and Ruby Burks Tim About Nu Programming Nu Neon Design Technology Inc 2011 07 21 原始内容存档于2011 07 24 Ruby License 2004 09 25 原始内容存档于2011 08 22 Ruby 2 6正式版釋出主打JIT 但卻會造成Rails效能下降 iThome 2023 06 13 原始内容存档于2022 05 21 中文 繁體 Shopify開發團隊公開以Rust重寫Ruby YJIT的權衡與改進細節 iThome 2023 06 13 原始内容存档于2023 01 22 中文 繁體 The Philosophy of Ruby A Conversation with Yukihiro Matsumoto Part I by Bill Venners on 2003 09 29 Artima Developer 英文 2007 09 17 原始内容存档于2019 07 05 Ruby语言入门东南大学出版社2010年4月第一版P19 To Ruby From Python 2010 10 26 原始内容存档于2022 02 22 To Ruby From Python 页面存档备份 存于互联网档案馆 When tested for truth only false and nil evaluate to a false value Everything else is true including 0 0 0 and Immutable String literal in Ruby 3 2017 11 27 原始内容存档于2022 04 15 Perl 6於2019年10月更名為Raku 存档副本 2013 10 22 原始内容存档于2015 09 24 O Reilly訪問Matz 2007 07 20 原始内容存档于2009 07 28 Larry Wall On Perl Religion and 2007 07 20 原始内容存档于2007 07 29 Guido談Python 3000及與Ruby的競爭 2007 07 23 原始内容存档于2012 11 20 外部連結 编辑Ruby的官方网站 页面存档备份 存于互联网档案馆 Programming Ruby 網路版 Ruby Application Archive RubyForge提供一個類似SourceForge和Freshmeat的環境給用Ruby或給Ruby寫的工具 現已停止運營 Ruby Documentation project Full Ruby on Rails Tutorial TryRuby 页面存档备份 存于互联网档案馆 英文 Ruby Taiwan社群 页面存档备份 存于互联网档案馆 Ruby中国社区 页面存档备份 存于互联网档案馆 目前中国Ruby开发者公认的Ruby中文社区 微服务架构在Ruby中 失效連結 英文 取自 https zh wikipedia org w index php title Ruby amp oldid 77677185, 维基百科,wiki,书籍,书籍,图书馆,

文章

,阅读,下载,免费,免费下载,mp3,视频,mp4,3gp, jpg,jpeg,gif,png,图片,音乐,歌曲,电影,书籍,游戏,游戏。