Contents 1 History 1.1 Early concept 1.2 The name "Ruby" 1.3 First publication 1.4 Early releases 1.5 Ruby 1.8 1.6 Ruby 1.9 1.7 Ruby 2.0 1.8 Ruby 2.1 1.9 Ruby 2.2 1.10 Ruby 2.3 1.11 Ruby 2.4 2 Table of versions 3 Philosophy 4 Features 5 Semantics 6 Syntax 7 Interaction 8 Examples 8.1 Strings 8.2 Collections 8.3 Control structures 8.4 Blocks and iterators 8.5 Classes 8.5.1 Open classes 8.6 Exceptions 8.7 Metaprogramming 8.8 More examples 9 Implementations 9.1 Matz's Ruby interpreter 9.2 Alternate implementations 9.3 Platform support 10 Repositories and libraries 11 See also 12 References 13 Further reading 14 External links


History[edit] Early concept[edit] Matsumoto has said that Ruby was conceived in 1993. In a 1999 post to the ruby-talk mailing list, he describes some of his early ideas about the language:[13] I was talking with my colleague about the possibility of an object-oriented scripting language. I knew Perl (Perl4, not Perl5), but I didn't like it really, because it had the smell of a toy language (it still has). The object-oriented language seemed very promising. I knew Python then. But I didn't like it, because I didn't think it was a true object-oriented language — OO features appeared to be add-on to the language. As a language maniac and OO fan for 15 years, I really wanted a genuine object-oriented, easy-to-use scripting language. I looked for but couldn't find one. So I decided to make it. Matsumoto describes the design of Ruby as being like a simple Lisp language at its core, with an object system like that of Smalltalk, blocks inspired by higher-order functions, and practical utility like that of Perl.[14] The name "Ruby"[edit] The name "Ruby" originated during an online chat session between Matsumoto and Keiju Ishitsuka on February 24, 1993, before any code had been written for the language.[15] Initially two names were proposed: "Coral" and "Ruby". Matsumoto chose the latter in a later e-mail to Ishitsuka.[16] Matsumoto later noted a factor in choosing the name "Ruby" – it was the birthstone of one of his colleagues.[17][18] First publication[edit] The first public release of Ruby 0.95 was announced on Japanese domestic newsgroups on December 21, 1995.[19][20] Subsequently, three more versions of Ruby were released in two days.[15] The release coincided with the launch of the Japanese-language ruby-list mailing list, which was the first mailing list for the new language. Already present at this stage of development were many of the features familiar in later releases of Ruby, including object-oriented design, classes with inheritance, mixins, iterators, closures, exception handling and garbage collection.[21] Early releases[edit] Following the release of Ruby 0.95 in 1995, several stable versions of Ruby were released in the following years: Ruby 1.0: December 25, 1996[15] Ruby 1.2: December 1998 Ruby 1.4: August 1999 Ruby 1.6: September 2000 In 1997, the first article about Ruby was published on the Web. In the same year, Matsumoto was hired by netlab.jp to work on Ruby as a full-time developer.[15] In 1998, the Ruby Application Archive was launched by Matsumoto, along with a simple English-language homepage for Ruby.[15] In 1999, the first English language mailing list ruby-talk began, which signaled a growing interest in the language outside Japan.[22] In this same year, Matsumoto and Keiju Ishitsuka wrote the first book on Ruby, The Object-oriented Scripting Language Ruby (オブジェクト指向スクリプト言語 Ruby), which was published in Japan in October 1999. It would be followed in the early 2000s by around 20 books on Ruby published in Japanese.[15] By 2000, Ruby was more popular than Python in Japan.[23] In September 2000, the first English language book Programming Ruby was printed, which was later freely released to the public, further widening the adoption of Ruby amongst English speakers. In early 2002, the English-language ruby-talk mailing list was receiving more messages than the Japanese-language ruby-list, demonstrating Ruby's increasing popularity in the English-speaking world. Ruby 1.8[edit] Ruby 1.8 was initially released in August 2003, was stable for a long time, and was retired June 2013.[24] Although deprecated, there is still code based on it. Ruby 1.8 is only partially compatible with Ruby 1.9. Ruby 1.8 has been the subject of several industry standards. The language specifications for Ruby were developed by the Open Standards Promotion Center of the Information-Technology Promotion Agency (a Japanese government agency) for submission to the Japanese Industrial Standards Committee (JISC) and then to the International Organization for Standardization (ISO). It was accepted as a Japanese Industrial Standard (JIS X 3017) in 2011[25] and an international standard (ISO/IEC 30170) in 2012.[26][27] Around 2005, interest in the Ruby language surged in tandem with Ruby on Rails, a web framework written in Ruby. Rails is frequently credited with increasing awareness of Ruby.[28] Ruby 1.9[edit] Ruby 1.9 was released on Christmas Day in 2007. Effective with Ruby 1.9.3, released October 31, 2011,[29] Ruby switched from being dual-licensed under the Ruby License and the GPL to being dual-licensed under the Ruby License and the two-clause BSD license.[30] Adoption of 1.9 was slowed by changes from 1.8 that required many popular third party gems to be rewritten. Ruby 1.9 introduces many significant changes over the 1.8 series.[31] Examples: block local variables (variables that are local to the block in which they are declared) an additional lambda syntax: f = ->(a,b) { puts a + b } an additional Hash literal syntax using colons for symbol keys: {symbol_key: "value"} == {:symbol_key => "value"} per-string character encodings are supported new socket API (IPv6 support) require_relative import security Ruby 1.9 has been obsolete since February 23, 2015,[32] and it will no longer receive bug and security fixes. Users are advised to upgrade to a more recent version. Ruby 2.0[edit] Ruby 2.0 added several new features, including: method keyword arguments, a new method, Module#prepend, for extending a class, a new literal for creating an array of symbols, new API for the lazy evaluation of Enumerables, and a new convention of using #to_h to convert objects to Hashes.[33] Ruby 2.0 is intended to be fully backward compatible with Ruby 1.9.3. As of the official 2.0.0 release on February 24, 2013, there were only five known (minor) incompatibilities.[34] It has been obsolete since February 22, 2016,[35] and it will no longer receive bug and security fixes. Users are advised to upgrade to a more recent version. Ruby 2.1[edit] Ruby 2.1.0 was released on Christmas Day in 2013.[36] The release includes speed-ups, bugfixes, and library updates. Starting with 2.1.0, Ruby's versioning policy is more like semantic versioning.[37] Although similar, Ruby's versioning policy is not compatible with semantic versioning: Ruby Semantic versioning MAJOR: Increased when incompatible change which can’t be released in MINOR. Reserved for special events. MAJOR: Increased when you make incompatible API changes. MINOR: increased every Christmas, may be API incompatible. MINOR: increased when you add functionality in a backwards-compatible manner. TEENY: security or bug fix which maintains API compatibility. May be increased more than 10 (such as 2.1.11), and will be released every 2–3 months. PATCH: increased when you make backwards-compatible bug fixes. PATCH: number of commits since last MINOR release (will be reset at 0 when releasing MINOR). - Semantic versioning also provides additional labels for pre-release and build metadata are available as extensions to the MAJOR.MINOR.PATCH format, not available at Ruby. Ruby 2.1 has been obsolete since April 1, 2017,[38] and it will no longer receive bug and security fixes. Users are advised to upgrade to a more recent version. Ruby 2.2[edit] Ruby 2.2.0 was released on Christmas Day in 2014.[39] The release includes speed-ups, bugfixes, and library updates and removes some deprecated APIs. Most notably, Ruby 2.2.0 introduces changes to memory handling – an incremental garbage collector, support for garbage collection of symbols and the option to compile directly against jemalloc. It also contains experimental support for using vfork(2) with system() and spawn(), and added support for the Unicode 7.0 specification. Features that were made obsolete or removed include callcc, the DL library, Digest::HMAC, lib/rational.rb, lib/complex.rb, GServer, Logger::Application as well as various C API functions.[40] PowerPC64 performance Since version 2.2.1,[41] Ruby MRI performance on PowerPC64 was improved.[42][43][44] Ruby 2.3[edit] Ruby 2.3.0 was released on Christmas Day in 2015. A few notable changes include: The ability to mark all string literals as frozen by default with a consequently large performance increase in string operations.[45] Hash comparison to allow direct checking of key/value pairs instead of just keys. A new safe navigation operator &. that can ease nil handling (e.g. instead of if obj && obj.foo && obj.foo.bar, we can use if obj&.foo&.bar). The did_you_mean gem is now bundled by default and required on startup to automatically suggest similar name matches on a NameError or NoMethodError. Hash#dig and Array#dig to easily extract deeply nested values (e.g. given profile = { social: { wikipedia: { name: 'Foo Baz' } } }, the value Foo Baz can now be retrieved by profile.dig(:social, :wikipedia, :name)). .grep_v(regexp) which will match all negative examples of a given regular expression in addition to other new features. The 2.3 branch also includes many performance improvements, updates, and bugfixes including changes to Proc#call, Socket and IO use of exception keywords, Thread#name handling, default passive Net::FTP connections, and Rake being removed from stdlib.[46] Ruby 2.4[edit] Ruby 2.4.0 was released on Christmas Day in 2016. A few notable changes include: Binding#irb: Start a REPL session similar to binding.pry Unify Fixnum and Bignum into Integer class String supports Unicode case mappings, not just ASCII a new method, Regexp#match?, which is a faster boolean version of Regexp#match Thread deadlock detection now shows threads with their backtrace and dependency The 2.4 branch also includes performance improvements to hash table, Array#max, Array#min, and instance variable access.[47] Ruby's popularity has been declining since 2014,[48] a slip that may be permanent in the face of increasing competition.[49]


Table of versions[edit] Version Latest teeny version Initial release date End of support phase End of security maintenance phase Old version, no longer supported: 1.0 NA 1996-12-25[50] NA NA Old version, no longer supported: 1.8 1.8.7-p375[51] 2003-08-04[52] 2012-06[53] 2014-07-01[54] Old version, no longer supported: 1.9 1.9.3-p551[55] 2007-12-25[56] 2014-02-23[57] 2015-02-23[58] Old version, no longer supported: 2.0 2.0.0-p648[59] 2013-02-24[60] 2015-02-24[59] 2016-02-24[59] Old version, no longer supported: 2.1 2.1.10[61] 2013-12-25[62] 2016-03-30[63][64] 2017-03-31[65][66] Old version, no longer supported: 2.2 2.2.9[67] 2014-12-25[68] 2017-03-28[69] 2018-03-31[70] Older version, yet still supported: 2.3 2.3.6[71] 2015-12-25[72] TBA TBA Older version, yet still supported: 2.4 2.4.3[73] 2016-12-25[74] TBA TBA Current stable version: 2.5 2.5.0[75] 2017-12-25[76] TBA TBA Future release: 2.6 2018-12-25[77] TBA TBA Future release: 3.0 2020[78][79] TBA TBA Legend: Old version Older version, still supported Latest version Latest preview version Future release


Philosophy[edit] Yukihiro Matsumoto, the creator of Ruby Matsumoto has said that Ruby is designed for programmer productivity and fun, following the principles of good user interface design.[80] At a Google Tech Talk in 2008 Matsumoto further stated, "I hope to see Ruby help every programmer in the world to be productive, and to enjoy programming, and to be happy. That is the primary purpose of Ruby language."[81] He stresses that systems design needs to emphasize human, rather than computer, needs:[82] Often people, especially computer engineers, focus on the machines. They think, "By doing this, the machine will run fast. By doing this, the machine will run more effectively. By doing this, the machine will something something something." They are focusing on machines. But in fact we need to focus on humans, on how humans care about doing programming or operating the application of the machines. We are the masters. They are the slaves. Ruby is said to follow the principle of least astonishment (POLA), meaning that the language should behave in such a way as to minimize confusion for experienced users. Matsumoto has said his primary design goal was to make a language that he himself enjoyed using, by minimizing programmer work and possible confusion. He has said that he had not applied the principle of least astonishment to the design of Ruby,[82] but nevertheless the phrase has come to be closely associated with the Ruby programming language. The phrase has itself been a source of surprise, as novice users may take it to mean that Ruby's behaviors try to closely match behaviors familiar from other languages. In a May 2005 discussion on the newsgroup comp.lang.ruby, Matsumoto attempted to distance Ruby from POLA, explaining that because any design choice will be surprising to someone, he uses a personal standard in evaluating surprise. If that personal standard remains consistent, there would be few surprises for those familiar with the standard.[83] Matsumoto defined it this way in an interview:[82] Everyone has an individual background. Someone may come from Python, someone else may come from Perl, and they may be surprised by different aspects of the language. Then they come up to me and say, 'I was surprised by this feature of the language, so Ruby violates the principle of least surprise.' Wait. Wait. The principle of least surprise is not for you only. The principle of least surprise means principle of least my surprise. And it means the principle of least surprise after you learn Ruby very well. For example, I was a C++ programmer before I started designing Ruby. I programmed in C++ exclusively for two or three years. And after two years of C++ programming, it still surprises me.


Features[edit] Thoroughly object-oriented with inheritance, mixins and metaclasses[84] Dynamic typing and duck typing Everything is an expression (even statements) and everything is executed imperatively (even declarations) Succinct and flexible syntax[85] that minimizes syntactic noise and serves as a foundation for domain-specific languages[86] Dynamic reflection and alteration of objects to facilitate metaprogramming[87] Lexical closures, iterators and generators, with a block syntax[88] Literal notation for arrays, hashes, regular expressions and symbols Embedding code in strings (interpolation) Default arguments Four levels of variable scope (global, class, instance, and local) denoted by sigils or the lack thereof Garbage collection First-class continuations Strict boolean coercion rules (everything is true except false and nil) Exception handling Operator overloading Built-in support for rational numbers, complex numbers and arbitrary-precision arithmetic Custom dispatch behavior (through method_missing and const_missing) Native threads and cooperative fibers (fibers are a 1.9/YARV feature) Initial support for Unicode and multiple character encodings (no ICU support)[89] Native plug-in API in C Interactive Ruby Shell (a REPL) Centralized package management through RubyGems Implemented on all major platforms Large standard library, including modules for YAML, JSON, XML, CGI, OpenSSL, HTTP, FTP, RSS, curses, zlib, and Tk[90]


Semantics[edit] Ruby is object-oriented: every value is an object, including classes and instances of types that many other languages designate as primitives (such as integers, booleans, and "null"). Variables always hold references to objects. Every function is a method and methods are always called on an object. Methods defined at the top level scope become methods of the Object class. Since this class is an ancestor of every other class, such methods can be called on any object. They are also visible in all scopes, effectively serving as "global" procedures. Ruby supports inheritance with dynamic dispatch, mixins and singleton methods (belonging to, and defined for, a single instance rather than being defined on the class). Though Ruby does not support multiple inheritance, classes can import modules as mixins. Ruby has been described as a multi-paradigm programming language: it allows procedural programming (defining functions/variables outside classes makes them part of the root, 'self' Object), with object orientation (everything is an object) or functional programming (it has anonymous functions, closures, and continuations; statements all have values, and functions return the last evaluation). It has support for introspection, reflection and metaprogramming, as well as support for interpreter-based[91] threads. Ruby features dynamic typing, and supports parametric polymorphism. According to the Ruby FAQ, the syntax is similar to Perl and the semantics are similar to Smalltalk but it differs greatly from Python.[92]


Syntax[edit] The syntax of Ruby is broadly similar to that of Perl and Python. Class and method definitions are signaled by keywords, whereas code blocks can be both defined by keywords or braces. In contrast to Perl, variables are not obligatorily prefixed with a sigil. When used, the sigil changes the semantics of scope of the variable. For practical purposes there is no distinction between expressions and statements.[93][94] Line breaks are significant and taken as the end of a statement; a semicolon may be equivalently used. Unlike Python, indentation is not significant. One of the differences of Ruby compared to Python and Perl is that Ruby keeps all of its instance variables completely private to the class and only exposes them through accessor methods (attr_writer, attr_reader, etc.). Unlike the "getter" and "setter" methods of other languages like C++ or Java, accessor methods in Ruby can be created with a single line of code via metaprogramming; however, accessor methods can also be created in the traditional fashion of C++ and Java. As invocation of these methods does not require the use of parentheses, it is trivial to change an instance variable into a full function, without modifying a single line of calling code or having to do any refactoring achieving similar functionality to C# and VB.NET property members. Python's property descriptors are similar, but come with a tradeoff in the development process. If one begins in Python by using a publicly exposed instance variable, and later changes the implementation to use a private instance variable exposed through a property descriptor, code internal to the class may need to be adjusted to use the private variable rather than the public property. Ruby’s design forces all instance variables to be private, but also provides a simple way to declare set and get methods. This is in keeping with the idea that in Ruby, one never directly accesses the internal members of a class from outside the class; rather, one passes a message to the class and receives a response. See the Examples section below for samples of code demonstrating Ruby syntax.


Interaction[edit] See also: Interactive Ruby Shell The Ruby official distribution also includes irb, an interactive command-line interpreter that can be used to test code quickly. The following code fragment represents a sample session using irb: $ irb irb(main):001:0> puts 'Hello, World' Hello, World => nil irb(main):002:0> 1+2 => 3


Examples[edit] This section does not cite any sources. Please help improve this section by adding citations to reliable sources. Unsourced material may be challenged and removed. (January 2014) (Learn how and when to remove this template message) The following examples can be run in a Ruby shell such as Interactive Ruby Shell, or saved in a file and run from the command line by typing ruby <filename>. Classic Hello world example: puts 'Hello World!' Some basic Ruby code: # Everything, including a literal, is an object, so this works: -199.abs # => 199 'ice is nice'.length # => 11 'ruby is cool.'.index('u') # => 1 "Nice Day Isn't It?".downcase.split('').uniq.sort.join # => " '?acdeinsty" Input: print 'Please type name >' name = gets.chomp puts "Hello #{name}." Conversions: puts 'Give me a number' number = gets.chomp puts number.to_i output_number = number.to_i + 1 puts output_number.to_s + ' is a bigger number.' Strings[edit] There are a variety of ways to define strings in Ruby. The following assignments are equivalent: a = "\nThis is a double-quoted string\n" a = %Q{\nThis is a double-quoted string\n} a = %{\nThis is a double-quoted string\n} a = %/\nThis is a double-quoted string\n/ a = <<-BLOCK This is a double-quoted string BLOCK Strings support variable interpolation: var = 3.14159 "pi is #{var}" => "pi is 3.14159" The following assignments are equivalent and produce raw strings: a = 'This is a single-quoted string' a = %q{This is a single-quoted string} Collections[edit] Constructing and using an array: a = [1, 'hi', 3.14, 1, 2, [4, 5]] a[2] # => 3.14 a.[](2) # => 3.14 a.reverse # => [[4, 5], 2, 1, 3.14, 'hi', 1] a.flatten.uniq # => [1, 'hi', 3.14, 2, 4, 5] Constructing and using an associative array (in Ruby, called a hash): hash = Hash.new # equivalent to hash = {} hash = { :water => 'wet', :fire => 'hot' } # makes the previous line redundant as we are now # assigning hash to a new, separate hash object puts hash[:fire] # prints "hot" hash.each_pair do |key, value| # or: hash.each do |key, value| puts "#{key} is #{value}" end # returns {:water=>"wet", :fire=>"hot"} and prints: # water is wet # fire is hot hash.delete :water # deletes the pair :water => 'wet' and returns "wet" hash.delete_if {|key,value| value == 'hot'} # deletes the pair :fire => 'hot' and returns {} Control structures[edit] If statement: # Generate a random number and print whether it's even or odd. if rand(100) % 2 == 0 puts "It's even" else puts "It's odd" end Blocks and iterators[edit] The two syntaxes for creating a code block: { puts 'Hello, World!' } # note the braces # or: do puts 'Hello, World!' end A code block can be passed to a method as an optional block argument. Many built-in methods have such arguments: 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. Parameter-passing a block to be a closure: # In an object instance variable (denoted with '@'), remember a block. def remember(&a_block) @block = a_block end # Invoke the preceding method, giving it a block that takes a name. remember {|name| puts "Hello, #{name}!"} # Call the closure (note that this happens not to close over any free variables): @block.call('Jon') # => "Hello, Jon!" Creating an anonymous function: proc {|arg| puts arg} Proc.new {|arg| puts arg} lambda {|arg| puts arg} ->(arg) {puts arg} # introduced in Ruby 1.9 Returning closures from a method: def create_set_and_get(initial_value=0) # note the default value of 0 closure_value = initial_value [ Proc.new {|x| closure_value = x}, Proc.new { closure_value } ] end setter, getter = create_set_and_get # returns two values setter.call(21) getter.call # => 21 # Parameter variables can also be used as a binding for the closure, # so the preceding can be rewritten as: def create_set_and_get(closure_value=0) [ proc {|x| closure_value = x } , proc { closure_value } ] end Yielding the flow of program control to a block that was provided at calling time: def use_hello yield "hello" end # Invoke the preceding method, passing it a block. use_hello {|string| puts string} # => 'hello' Iterating over enumerations and arrays using blocks: array = [1, 'hi', 3.14] array.each {|item| puts item } # prints: # 1 # 'hi' # 3.14 array.each_index {|index| puts "#{index}: #{array[index]}" } # prints: # 0: 1 # 1: 'hi' # 2: 3.14 # The following uses a (a..b) Range (3..6).each {|num| puts num } # prints: # 3 # 4 # 5 # 6 # The following uses a (a...b) Range (3...6).each {|num| puts num } # prints: # 3 # 4 # 5 A method such as inject can accept both a parameter and a block. The inject method iterates over each member of a list, performing some function on it while retaining an aggregate. This is analogous to the foldl function in functional programming languages. For example: [1,3,5].inject(10) {|sum, element| sum + element} # => 19 On the first pass, the block receives 10 (the argument to inject) as sum, and 1 (the first element of the array) as element. This returns 11, which then becomes sum on the next pass. It is added to 3 to get 14, which is then added to 5 on the third pass, to finally return 19. Using an enumeration and a block to square the numbers 1 to 10 (using a range): (1..10).collect {|x| x*x} # => [1, 4, 9, 16, 25, 36, 49, 64, 81, 100] Or invoke a method on each item (map is a synonym for collect): (1..5).map(&:to_f) # => [1.0, 2.0, 3.0, 4.0, 5.0] Classes[edit] The following code defines a class named Person. In addition to initialize, the usual constructor to create new objects, it has two methods: one to override the <=> comparison operator (so Array#sort can sort by age) and the other to override the to_s method (so Kernel#puts can format its output). Here, attr_reader is an example of metaprogramming in Ruby: attr_accessor defines getter and setter methods of instance variables, but attr_reader only getter methods. The last evaluated statement in a method is its return value, allowing the omission of an explicit return statement. class Person attr_reader :name, :age def initialize(name, age) @name, @age = name, age end def <=>(person) # the 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 The preceding code prints three names in reverse age order: Bob (33) Ash (23) Chris (16) Person is a constant and is a reference to a Class object. Open classes[edit] In Ruby, classes are never closed: methods can always be added to an existing class. This applies to all classes, including the standard, built-in classes. All that is needed to do is open up a class definition for an existing class, and the new contents specified will be added to the existing contents. A simple example of adding a new method to the standard library's Time class: # re-open Ruby's Time class class Time def yesterday self - 86400 end end today = Time.now # => 2013-09-03 16:09:37 +0300 yesterday = today.yesterday # => 2013-09-02 16:09:37 +0300 Adding methods to previously defined classes is often called monkey-patching. If performed recklessly, the practice can lead to both behavior collisions with subsequent unexpected results and code scalability problems. Exceptions[edit] An exception is raised with a raise call: raise An optional message can be added to the exception: raise "This is a message" Exceptions can also be specified by the programmer: raise ArgumentError, "Illegal arguments!" Alternatively, an exception instance can be passed to the raise method: raise ArgumentError.new("Illegal arguments!") This last construct is useful when raising an instance of a custom exception class featuring a constructor that takes more than one argument: class ParseError < Exception def initialize input, line, pos super "Could not parse '#{input}' at line #{line}, position #{pos}" end end raise ParseError.new("Foo", 3, 9) Exceptions are handled by the rescue clause. Such a clause can catch exceptions that inherit from StandardError. Other flow control keywords that can be used when handling exceptions are else and ensure: begin # do something rescue # handle exception else # do this if no exception was raised ensure # do this whether or not an exception was raised end It is a common mistake to attempt to catch all exceptions with a simple rescue clause. To catch all exceptions one must write: begin # do something rescue Exception # Exception handling code here. # Don't write only "rescue"; that only catches StandardError, a subclass of Exception. end Or catch particular exceptions: begin # do something rescue RuntimeError # handle only RuntimeError and its subclasses end It is also possible to specify that the exception object be made available to the handler clause: begin # do something rescue RuntimeError => e # handling, possibly involving e, such as "puts e.to_s" end Alternatively, the most recent exception is stored in the magic global $!. Several exceptions can also be caught: begin # do something rescue RuntimeError, Timeout::Error => e # handling, possibly involving e end Metaprogramming[edit] This section needs additional citations for verification. Please help improve this article by adding citations to reliable sources. Unsourced material may be challenged and removed. (January 2014) (Learn how and when to remove this template message) Ruby code can programmatically modify, at runtime, aspects of its own structure that would be fixed in more rigid languages, such as class and method definitions. This sort of metaprogramming can be used to write more concise code and effectively extend the language. For example, the following Ruby code generates new methods for the built-in String class, based on a list of colors. The methods wrap the contents of the string with an HTML tag styled with the respective color. COLORS = { black: "000", red: "f00", green: "0f0", yellow: "ff0", blue: "00f", magenta: "f0f", cyan: "0ff", white: "fff" } class String COLORS.each do |color,code| define_method "in_#{color}" do "<span style=\"color: ##{code}\">#{self}</span>" end end end The generated methods could then be used like this: "Hello, World!".in_blue => "<span style=\"color: #00f\">Hello, World!</span>" To implement the equivalent in many other languages, the programmer would have to write each method (in_black, in_red, in_green, etc.) separately. Some other possible uses for Ruby metaprogramming include: intercepting and modifying method calls implementing new inheritance models dynamically generating classes from parameters automatic object serialization interactive help and debugging More examples[edit] More sample Ruby code is available as algorithms in the following article: Exponentiating by squaring


Implementations[edit] See also: Ruby MRI § Operating systems Matz's Ruby interpreter[edit] The original Ruby interpreter is often referred to as the Matz's Ruby Interpreter or MRI. This implementation is written in C and uses its own Ruby-specific virtual machine. The standardized and retired Ruby 1.8 implementation was written in C, as a single-pass interpreted language.[24] Starting with Ruby 1.9, and continuing with Ruby 2.x and above, the official Ruby interpreter has been YARV ("Yet Another Ruby VM"), and this implementation has superseded the slower virtual machine used in previous releases of MRI. Alternate implementations[edit] As of 2018[update], there are a number of alternative implementations of Ruby, including JRuby, Rubinius, and mruby. Each takes a different approach, with JRuby and Rubinius providing just-in-time compilation and mruby also providing ahead-of-time compilation. Ruby has three major alternate implementations: JRuby, a Java implementation that runs on the Java virtual machine. JRuby currently targets Ruby 2.3. TruffleRuby, a Java implementation using the Truffle language implementation framework and the Graal compiler Rubinius, a C++ bytecode virtual machine that uses LLVM to compile to machine code at runtime. The bytecode compiler and most core classes are written in pure Ruby. Rubinius currently targets Ruby 2.1, Other Ruby implementations include: MagLev, a Smalltalk implementation that runs on GemTalk Systems' GemStone/S VM mruby, an implementation designed to be embedded into C code, in a similar vein to Lua. It is currently being developed by Yukihiro Matsumoto and others RGSS, or Ruby Game Scripting System, a proprietary implementation that is used by the RPG Maker series of software for game design and modification of the RPG Maker engine A transpiler (partial) from Ruby to Julia, julializer is available. It can be used for a large speedup over e.g. Ruby or JRuby implementations (may only be useful for numerical code).[95] Topaz, a Ruby implementation written in Python Opal, a web-based interpreter that compiles Ruby to JavaScript Other now defunct Ruby implementations were: MacRuby, a Mac OS X implementation on the Objective-C runtime. Its iOS counterpart is called RubyMotion IronRuby an implementation on the .NET Framework Cardinal, an implementation for the Parrot virtual machine Ruby Enterprise Edition, often shortened to ree, an implementation optimized to handle large-scale Ruby on Rails projects HotRuby, a JavaScript and ActionScript implementation of the Ruby programming language The maturity of Ruby implementations tends to be measured by their ability to run the Ruby on Rails (Rails) framework, because it is complex to implement and uses many Ruby-specific features. The point when a particular implementation achieves this goal is called "the Rails singularity". The reference implementation (MRI), JRuby, and Rubinius[96] are all able to run Rails unmodified in a production environment. Platform support[edit] Matsumoto originally did Ruby development on the 4.3BSD-based Sony NEWS-OS 3.x, but later migrated his work to SunOS 4.x, and finally to Linux.[97][98] By 1999, Ruby was known to work across many different operating systems, including NEWS-OS, SunOS, AIX, SVR4, Solaris, NEC UP-UX, NeXTSTEP, BSD, Linux, Mac OS, DOS, Windows, and BeOS.[99] Modern Ruby versions and implementations are available on many operating systems, such as Linux, BSD, Solaris, AIX, macOS, Windows, Windows Phone,[100] Windows CE, Symbian OS, BeOS, and IBM i.


Repositories and libraries[edit] RubyGems is Ruby's package manager. A Ruby package is called a "gem" and can easily be installed via the command line. Most gems are libraries, though a few exist that are applications, such as IDEs.[101] There are over 9,000 Ruby gems hosted on RubyGems.org. Many new and existing Ruby libraries are hosted on GitHub, a service that offers version control repository hosting for Git. The Ruby Application Archive, which hosted applications, documentation, and libraries for Ruby programming, was maintained until 2013, when its function was transferred to RubyGems.[102]


See also[edit] Free software portal Computer programming portal Comparison of programming languages Metasploit Project — the world's largest Ruby project, with over 700,000 lines of code Why's (poignant) Guide to Ruby — an online ruby textbook in graphic novel format XRuby


References[edit] ^ "Ruby 2.5.0 Released". Ruby Programming Language. 2017-12-25. Retrieved 2017-12-25.  ^ "[ruby] Contents of /trunk/COPYING". Retrieved 2 May 2015.  ^ "[ruby] Contents of /trunk/GPL". Retrieved 2 May 2015.  ^ "[ruby] Contents of /trunk/BSDL". Retrieved 2 May 2015.  ^ a b c Cooper, Peter (2009). Beginning Ruby: From Novice to Professional. Beginning from Novice to Professional (2nd ed.). Berkeley: APress. p. 101. ISBN 1-4302-2363-4. To a lesser extent, Python, LISP, Eiffel, Ada, and C++ have also influenced Ruby.  ^ a b c d e f Bini, Ola (2007). Practical JRuby on Rails Web 2.0 Projects: Bringing Ruby on Rails to Java. Berkeley: APress. p. 3. ISBN 1-59059-881-4. It draws primarily on features from Perl, Smalltalk, Python, Lisp, Dylan, and CLU.  ^ Bini, Ola. "Ioke". Ioke.org. Retrieved 2011-07-21. inspired by Io, Smalltalk, Lisp and Ruby  ^ "Introduction — Julia Language 0.4.1 documentation". Retrieved 13 November 2015.  ^ Burks, Tim. "About Nu™". Programming Nu™. Neon Design Technology, Inc. Retrieved 2011-07-21.  ^ Ring Team (3 December 2017). "Ring and other languages". ring-lang.net. ring-lang.  ^ Lattner, Chris (2014-06-03). "Chris Lattner's Homepage". Chris Lattner. Retrieved 2014-06-03. The Swift language is the product of tireless effort from a team of language experts, documentation gurus, compiler optimization ninjas, and an incredibly important internal dogfooding group who provided feedback to help refine and battle-test ideas. Of course, it also greatly benefited from the experiences hard-won by many other languages in the field, drawing ideas from Objective-C, Rust, Haskell, Ruby, Python, C#, CLU, and far too many others to list.  ^ "About Ruby". Retrieved 2 March 2014.  ^ Shugo Maeda (17 December 2002). "The Ruby Language FAQ". Retrieved 2 March 2014.  ^ Yukihiro Matsumoto (13 February 2006), ruby-talk: Re: Ruby's lisp features, retrieved 2 March 2014  ^ a b c d e f "History of Ruby".  ^ "[FYI: historic] The decisive moment of the language name Ruby. (Re: [ANN] ruby 1.8.1)" (E-mail from Hiroshi Sugihara to ruby-talk).  ^ "The Ruby Language FAQ – 1.3 Why the name 'Ruby'?". Ruby-Doc.org. Retrieved April 10, 2012.  ^ Yukihiro Matsumoto (June 11, 1999). "Re: the name of Ruby?". Ruby-Talk (Mailing list). Retrieved April 10, 2012.  ^ "More archeolinguistics: unearthing proto-Ruby". Retrieved 2 May 2015.  ^ "[ruby-talk:00382] Re: history of ruby". Retrieved 2 May 2015.  ^ "[ruby-list:124] TUTORIAL - ruby's features". Retrieved 2 May 2015.  ^ "An Interview with the Creator of Ruby".  ^ Yukihiro Matsumoto (October 2000). "Programming Ruby: Forward". Retrieved 5 March 2014.  ^ a b "We retire Ruby 1.8.7". Retrieved 2 May 2015.  ^ "IPA 独立行政法人 情報処理推進機構:プレス発表 プログラム言語RubyのJIS規格(JIS X 3017)制定について". Retrieved 2 May 2015.  ^ "IPA 独立行政法人 情報処理推進機構:プレス発表 プログラム言語Ruby、国際規格として承認". Retrieved 2 May 2015.  ^ "ISO/IEC 30170:2012". Retrieved 2017-03-10.  ^ Web Development: Ruby on Rails. Devarticles.com (2007-03-22). Retrieved on 2013-07-17. ^ "Ruby 1.9.3 p0 is released". ruby-lang.org. October 31, 2011. Retrieved February 20, 2013.  ^ "v1_9_3_0/NEWS". Ruby Subversion source repository. ruby-lang.org. September 17, 2011. Retrieved February 20, 2013.  ^ Ruby 1.9: What to Expect. Slideshow.rubyforge.org. Retrieved on 2013-07-17. ^ "Support for Ruby 1.9.3 has ended". Retrieved 2 May 2015.  ^ Endoh, Yusuke. (2013-02-24) Ruby 2.0.0-p0 is released. Ruby-lang.org. Retrieved on 2013-07-17. ^ Endoh, Yusuke. (2013-02-24) Ruby 2.0.0-p0 is released. Ruby-lang.org. Retrieved on 2013-07-17. ^ usa (2016-02-24). "Support plans for Ruby 2.0.0 and Ruby 2.1". Ruby-lang.org. Retrieved 2017-04-18.  ^ "Ruby 2.1.0 is released". December 25, 2013. Retrieved December 26, 2013.  ^ "Semantic Versioning starting with Ruby 2.1.0". December 21, 2013. Retrieved December 27, 2013.  ^ "Support for Ruby 2.1 has ended". Retrieved 4 April 2017.  ^ "Ruby 2.2.0 Released". December 25, 2014. Retrieved January 4, 2015.  ^ "ruby/NEWS at v2_2_0 · ruby/ruby · GitHub". GitHub. Retrieved 2 May 2015.  ^ Gustavo Frederico Temple Pedrosa, Vitor de Lima, Leonardo Bianconi (2015). "Ruby 2.2.1 Released". Retrieved 12 July 2016. CS1 maint: Multiple names: authors list (link) ^ Gustavo Frederico Temple Pedrosa, Vitor de Lima, Leonardo Bianconi (2015). "v2.2.1 ChangeLog". Retrieved 12 July 2016. CS1 maint: Multiple names: authors list (link) ^ Gustavo Frederico Temple Pedrosa, Vitor de Lima, Leonardo Bianconi (2014). "Specifying non volatile registers for increase performance in ppc64". Retrieved 12 July 2016. CS1 maint: Multiple names: authors list (link) ^ Gustavo Frederico Temple Pedrosa, Vitor de Lima, Leonardo Bianconi (2014). "Specifying MACRO for increase performance in ppc64". Retrieved 12 July 2016. CS1 maint: Multiple names: authors list (link) ^ "Ruby 2.3.0 changes and features - Running with Ruby". dev.mensfeld.pl.  ^ "Ruby/NEWS at v.2_3_0 - ruby/ruby - Github". GitHub. Retrieved 25 December 2015.  ^ "Ruby 2.4.0 Released". www.ruby-lang.org. Retrieved 2016-12-30.  ^ "Losing steam: Don't drop everything to learn Ruby on Rails".  ^ "Ruby's decline in popularity may be permanent".  ^ www.rubyinside.com http://www.rubyinside.com/the-ruby-communitys-christmas-releases-4118.html/.  Missing or empty |title= (help) ^ "A Patch in Time: Securing Ruby".  ^ "ruby-1.8.0 released!". www.ruby-lang.org.  ^ "Plans for 1.8.7". www.ruby-lang.org.  ^ "EOL for Ruby 1.8.7 and 1.9.2". www.ruby-lang.org.  ^ "Ruby 1.9.3-p551 Released". www.ruby-lang.org.  ^ "Ruby 1.9.0 Released". www.ruby-lang.org.  ^ "Support for Ruby version 1.9.3 will end on February 23, 2015". www.ruby-lang.org.  ^ "Support for Ruby 1.9.3 has ended". www.ruby-lang.org.  ^ a b c "Ruby 2.0.0-p648 Released". www.ruby-lang.org.  ^ "Ruby 2.0.0-p0 is released". www.ruby-lang.org.  ^ "Ruby 2.1.10 Released". www.ruby-lang.org.  ^ "Ruby 2.1.0 is released". www.ruby-lang.org.  ^ "Support plans for Ruby 2.0.0 and Ruby 2.1". www.ruby-lang.org.  ^ "Ruby 2.1.9 Released". www.ruby-lang.org.  ^ "ReleaseEngineering - Ruby - Ruby Issue Tracking System". bugs.ruby-lang.org.  ^ "Support of Ruby 2.1 has ended". www.ruby-lang.org.  ^ "Ruby 2.2.9 Released". www.ruby-lang.org.  ^ "Ruby 2.2.0 Released". www.ruby-lang.org.  ^ "Ruby 2.2.7 Released". www.ruby-lang.org.  ^ "Support of Ruby 2.1 has ended". www.ruby-lang.org.  ^ "Ruby 2.3.6 Released". www.ruby-lang.org.  ^ "Ruby 2.3.0 Released". www.ruby-lang.org.  ^ "Ruby 2.4.3 Released". www.ruby-lang.org.  ^ "Ruby 2.4.0 Released". www.ruby-lang.org.  ^ "Ruby 2.5.0 Released". www.ruby-lang.org.  ^ "Ruby 2.5.0 Released". www.ruby-lang.org.  ^ "Ruby Roadmap". www.ruby-lang.org.  ^ "Ruby 3x3: Matz, Koichi, and Tenderlove on the future of Ruby Performance".  ^ "What's coming in Ruby 3 and Rails 5 - Mangrove". www.mangrove.com.  ^ "The Ruby Programming Language". Retrieved 2 May 2015.  ^ Google Tech Talks – Ruby 1.9 on YouTube ^ a b c Bill Venners. "The Philosophy of Ruby". Retrieved 2 May 2015.  ^ "Welcome to RUBYWEEKLYNEWS.ORG". 4 July 2017.  ^ Bruce Stewart (29 November 2001). "An Interview with the Creator of Ruby - O'Reilly Media". Retrieved 2 May 2015.  ^ Bill Venners. "Dynamic Productivity with Ruby". Retrieved 2 May 2015.  ^ "Language Workbenches: The Killer-App for Domain Specific Languages?". martinfowler.com. Retrieved 2 May 2015.  ^ "Ruby – Add class methods at runtime".  ^ Bill Venners. "Blocks and Closures in Ruby". Retrieved 2 May 2015.  ^ "Feature #2034: Consider the ICU Library for Improving and Expanding Unicode Support - Ruby trunk - Ruby Issue Tracking System". Retrieved 2 May 2015.  ^ Britt, James. "Ruby 2.0.0 Standard Library Documentation". Retrieved 2013-12-09.  ^ Green threads ^ "The Ruby Language FAQ: How Does Ruby Stack Up Against...?". Retrieved 2 May 2015.  ^ "[ruby-talk:01120] Re: The value of while..." In Ruby's syntax, statement is just a special case of an expression that cannot appear as an argument (e.g. multiple assignment).  ^ "[ruby-talk:02460] Re: Precedence question". statement [...] can not be part of expression unless grouped within parentheses.  ^ "GitHub - remove/virtual_module: Born to make your Ruby Code more than 3x faster. Hopefully".  ^ Peter Cooper (2010-05-18). "The Why, What, and How of Rubinius 1.0's Release".  ^ Maya Stodte (February 2000). "IBM developerWorks – Ruby: a new language". Archived from the original on August 18, 2000. Retrieved 3 March 2014.  ^ Yukihiro Matsumoto (August 2002). "lang-ruby-general: Re: question about Ruby initial development". Retrieved 3 March 2014.  ^ Yukihiro Matsumoto (5 January 1999). "ruby-talk: Re: hah, check these errors". Retrieved 3 March 2014.  ^ "Iron Ruby on Windows Phone 7".  ^ "The Ruby Toolbox". Retrieved 2015-04-04.  ^ "We retire raa.ruby-lang.org". 2013-08-08. Retrieved 2016-01-03. 


Further reading[edit] Metz, Sandi (September 5, 2012), Practical Object-Oriented Design in Ruby (First ed.), Addison-Wesley, p. 272, ISBN 0-321-72133-0  McAnally, Jeremy; Arkin, Assaf (March 28, 2009), Ruby in Practice (First ed.), Manning Publications, p. 360, ISBN 1-933988-47-9  Thomas, Dave; Fowler, Chad; Hunt, Andy (April 28, 2009), Programming Ruby 1.9: The Pragmatic Programmers' Guide (Third ed.), Pragmatic Bookshelf, p. 1000, ISBN 1-934356-08-5  Black, David (June 4, 2009), The Well-Grounded Rubyist (First ed.), Manning Publications, p. 520, ISBN 1-933988-65-7  Flanagan, David; Matsumoto, Yukihiro (January 25, 2008), The Ruby Programming Language (First ed.), O'Reilly Media, p. 446, ISBN 0-596-51617-7  Baird, Kevin (June 8, 2007), Ruby by Example: Concepts and Code (First ed.), No Starch Press, p. 326, ISBN 1-59327-148-4  Fitzgerald, Michael (May 14, 2007), Learning Ruby (First ed.), O'Reilly Media, p. 255, ISBN 0-596-52986-4  Cooper, Peter (March 26, 2007), Beginning Ruby: From Novice to Professional (First ed.), Apress, p. 664, ISBN 1-59059-766-4  Fulton, Hal (November 4, 2006), The Ruby Way (Second ed.), Addison-Wesley, p. 888, ISBN 0-596-52369-6  Carlson, Lucas; Richardson, Leonard (July 19, 2006), Ruby Cookbook (First ed.), O'Reilly Media, p. 906, ISBN 0-596-52369-6 


External links[edit] Wikiquote has quotations related to: Ruby (programming language) Wikimedia Commons has media related to Ruby programming language. Wikibooks has a book on the topic of: Ruby Programming Wikiversity has learning resources about Topic:Ruby Official website Official Ruby documentation Ruby User Guide — by Yukihiro Matsumoto, the creator of Ruby A community-driven Ruby coding style guide Ruby From Other Languages Ruby Forum — gateway to the ruby-talk mailing list Try Ruby! — web-based Ruby REPL Ruby Draft Specification, September 2010 Ruby at Curlie (based on DMOZ) v t e Ruby programming language Implementations Active Ruby MRI; YARV mruby JRuby Rubinius MagLev RubyMotion Discontinued MacRuby IronRuby XRuby RubyJS HotRuby IDE Komodo NetBeans RadRails RubyMine Applications Capistrano Chef Hackety Hack Homebrew Interactive Ruby Shell Pry Puppet Rake Redmine RSpec RubyGems RVM Libraries and frameworks Adhearsion Camping eRuby (RHTML) Merb Padrino RubyCocoa Ruby on Rails Shoes Sinatra QtRuby Server software mod_ruby Mongrel Phusion Passenger (mod_rails/mod_rack) Rack WEBrick People Yukihiro Matsumoto David Heinemeier Hansson why the lucky stiff Other Document format why's (poignant) Guide to Ruby Ruby Central RubyKaigi RubyForge Ruby License Category Commons v t e Programming languages Comparison Timeline History Assembly BASIC C C++ C# COBOL Fortran Go Groovy Haskell Java JavaScript (JS) Kotlin Lisp Lua Objective-C Pascal Perl PHP Python Rexx Ruby Rust Shell Smalltalk Swift Visual Basic .NET (VB.NET) VBScript more... Category Lists Alphabetical Categorical Generational Non-English-based v t e Free and open-source software General Alternative terms for free software Comparison of open-source and closed-source software Comparison of source code hosting facilities Free software Free software project directories Gratis versus libre Long-term support Open-source software Open-source software development Outline Software packages Audio Bioinformatics Codecs Collaboration Configuration management Device drivers Graphics Wireless Geophysics Health Mathematics Operating systems Programming languages Routing Statistics Television Video games Web applications Content management systems E-commerce Word processors Android apps iOS apps Commercial Trademarked Formerly proprietary Community Free software movement History Open-source software movement Organizations Events Licenses AFL Apache APSL Artistic Beerware Boost BSD CC0 CDDL EPL GNU GPL GNU LGPL ISC MIT MPL Ms-PL/RL Python Python Software Foundation Sleepycat Unlicense WTFPL zlib License types and standards Comparison of free and open-source software licenses Contributor License Agreement Copyleft Debian Free Software Guidelines Definition of Free Cultural Works Free license The Free Software Definition The Open Source Definition Open-source license Permissive software licence Public domain Viral license Challenges Binary blob Digital rights management Hardware restrictions License proliferation Mozilla software rebranding Proprietary software SCO/Linux controversies Secure boot Software patents Software security Trusted Computing Related topics The Cathedral and the Bazaar Forking Microsoft Open Specification Promise Revolution OS Book Category Commons Portal v t e ISO standards by standard number List of ISO standards / ISO romanizations / IEC standards 1–9999 1 2 3 4 5 6 7 9 16 31 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 128 216 217 226 228 233 259 269 302 306 428 518 519 639 -1 -2 -3 -5 -6 646 690 732 764 843 898 965 1000 1004 1007 1073-1 1413 1538 1745 1989 2014 2015 2022 2047 2108 2145 2146 2240 2281 2709 2711 2788 2848 2852 3029 3103 3166 -1 -2 -3 3297 3307 3602 3864 3901 3977 4031 4157 4217 4909 5218 5428 5775 5776 5800 5964 6166 6344 6346 6385 6425 6429 6438 6523 6709 7001 7002 7098 7185 7200 7498 7736 7810 7811 7812 7813 7816 8000 8178 8217 8571 8583 8601 8632 8652 8691 8807 8820-5 8859 -1 -2 -3 -4 -5 -6 -7 -8 -8-I -9 -10 -11 -12 -13 -14 -15 -16 8879 9000/9001 9075 9126 9293 9241 9362 9407 9506 9529 9564 9594 9660 9897 9899 9945 9984 9985 9995 10000–19999 10005 10006 10007 10116 10118-3 10160 10161 10165 10179 10206 10218 10303 -11 -21 -22 -28 -238 10383 10487 10585 10589 10646 10664 10746 10861 10957 10962 10967 11073 11170 11179 11404 11544 11783 11784 11785 11801 11898 11940 (-2) 11941 11941 (TR) 11992 12006 12182 12207 12234-2 13211 -1 -2 13216 13250 13399 13406-2 13450 13485 13490 13567 13568 13584 13616 14000 14031 14224 14289 14396 14443 14496 -2 -3 -6 -10 -11 -12 -14 -17 -20 14644 14649 14651 14698 14750 14764 14882 14971 15022 15189 15288 15291 15292 15398 15408 15444 -3 15445 15438 15504 15511 15686 15693 15706 -2 15707 15897 15919 15924 15926 15926 WIP 15930 16023 16262 16612-2 16750 16949 (TS) 17024 17025 17100 17203 17369 17442 17799 18000 18004 18014 18245 18629 18916 19005 19011 19092 (-1 -2) 19114 19115 19125 19136 19439 19500 19501 19502 19503 19505 19506 19507 19508 19509 19510 19600:2014 19752 19757 19770 19775-1 19794-5 19831 20000+ 20000 20022 20121 20400 21000 21047 21500 21827:2002 22000 23270 23271 23360 24517 24613 24617 24707 25178 25964 26000 26300 26324 27000 series 27000 27001 27002 27006 27729 28000 29110 29148 29199-2 29500 30170 31000 32000 38500 40500 42010 55000 80000 -1 -2 -3 Category Authority control LCCN: sh00000128 GND: 4653817-3 SUDOC: 07705802X BNF: cb144105976 (data) BNE: XX4424926 Retrieved from "https://en.wikipedia.org/w/index.php?title=Ruby_(programming_language)&oldid=826557905" Categories: Ruby (programming language)Articles with example Ruby codeClass-based programming languagesDynamic programming languagesDynamically typed programming languagesFree software programmed in CISO standardsObject-oriented programming languagesProgramming languages created in 1995Programming languages with an ISO standardScripting languagesSoftware using the BSD licenseText-oriented programming languagesFree compilers and interpretersHidden categories: CS1 maint: Multiple names: authors listPages with citations lacking titlesPages with citations having bare URLsPages using deprecated image syntaxArticles needing additional references from January 2014All articles needing additional referencesArticles containing potentially dated statements from 2018All articles containing potentially dated statementsOfficial website different in Wikidata and WikipediaArticles with Curlie linksWikipedia articles with LCCN identifiersWikipedia articles with GND identifiersWikipedia articles with BNF identifiers


Navigation menu Personal tools Not logged inTalkContributionsCreate accountLog in Namespaces ArticleTalk Variants Views ReadEditView history More Search Navigation Main pageContentsFeatured contentCurrent eventsRandom articleDonate to WikipediaWikipedia store Interaction HelpAbout WikipediaCommunity portalRecent changesContact page Tools What links hereRelated changesUpload fileSpecial pagesPermanent linkPage informationWikidata itemCite this page Print/export Create a bookDownload as PDFPrintable version In other projects Wikimedia CommonsWikibooksWikiquoteWikiversity Languages العربيةAzərbaycancaتۆرکجهবাংলাБеларускаяБългарскиBosanskiCatalàČeštinaDanskDeutschEestiΕλληνικάEspañolEsperantoEuskaraفارسیFrançaisGalego한국어ՀայերենHrvatskiBahasa IndonesiaInterlinguaItalianoעבריתქართულიLatviešuLietuviųLumbaartMagyarമലയാളംमराठीBahasa Melayuမြန်မာဘာသာNederlands日本語NorskNorsk nynorskଓଡ଼ିଆਪੰਜਾਬੀPolskiPortuguêsRomânăРусскийScotsShqipSimple EnglishSlovenčinaکوردیСрпски / srpskiSrpskohrvatski / српскохрватскиSuomiSvenskaதமிழ்Татарча/tatarçaతెలుగుไทยТоҷикӣTürkçeУкраїнськаاردوTiếng Việt粵語Žemaitėška中文 Edit links This page was last edited on 19 February 2018, at 20:33. Text is available under the Creative Commons Attribution-ShareAlike License; additional terms may apply. By using this site, you agree to the Terms of Use and Privacy Policy. Wikipedia® is a registered trademark of the Wikimedia Foundation, Inc., a non-profit organization. Privacy policy About Wikipedia Disclaimers Contact Wikipedia Developers Cookie statement Mobile view (window.RLQ=window.RLQ||[]).push(function(){mw.config.set({"wgPageParseReport":{"limitreport":{"cputime":"1.016","walltime":"1.204","ppvisitednodes":{"value":6878,"limit":1000000},"ppgeneratednodes":{"value":0,"limit":1500000},"postexpandincludesize":{"value":291942,"limit":2097152},"templateargumentsize":{"value":8815,"limit":2097152},"expansiondepth":{"value":29,"limit":40},"expensivefunctioncount":{"value":4,"limit":500},"entityaccesscount":{"value":1,"limit":400},"timingprofile":["100.00% 960.161 1 -total"," 47.00% 451.249 1 Template:Reflist"," 33.77% 324.289 92 Template:Cite_web"," 14.03% 134.746 2 Template:Infobox"," 10.88% 104.457 1 Template:Infobox_programming_language"," 5.15% 49.449 5 Template:Navbox"," 4.64% 44.573 11 Template:Citation"," 3.98% 38.200 1 Template:Infobox_software/simple"," 3.36% 32.240 1 Template:Commons_category"," 3.33% 31.981 1 Template:Unreferenced_section"]},"scribunto":{"limitreport-timeusage":{"value":"0.459","limit":"10.000"},"limitreport-memusage":{"value":7143440,"limit":52428800}},"cachereport":{"origin":"mw1340","timestamp":"20180219203216","ttl":86400,"transientcontent":true}}});});(window.RLQ=window.RLQ||[]).push(function(){mw.config.set({"wgBackendResponseTime":84,"wgHostname":"mw1266"});});


Ruby_(programming_language) - Photos and All Basic Informations

Ruby_(programming_language) More Links

Ruby (disambiguation)Ruby On RailsProgramming ParadigmMulti-paradigm Programming LanguageObject-oriented ProgrammingImperative ProgrammingFunctional ProgrammingReflective ProgrammingSoftware DesignYukihiro MatsumotoSoftware DeveloperSoftware Release Life CycleType SystemDuck TypingDynamic TypingStrong TypingScope (computer Science)C (programming Language)Operating SystemCross-platformSoftware LicenseRuby LicenseGNU GPL2-clause BSDFilename ExtensionProgramming Language ImplementationRuby MRIYARVRubiniusMagLev (software)JRubyMacRubyRubyMotionMrubyAda (programming Language)C++CLU (programming Language)Dylan (programming Language)Eiffel (programming Language)Lisp (programming Language)Lua (programming Language)PerlPython (programming Language)SmalltalkClojureCoffeeScriptCrystal (programming Language)D (programming Language)Elixir (programming Language)Falcon (programming Language)Groovy (programming Language)Ioke (programming Language)Julia (programming Language)Mirah (programming Language)Nu (programming Language)Reia (programming Language)Ring (programming Language)Rust (programming Language)Swift (programming Language)Wikibooks:Ruby ProgrammingDynamic Programming LanguageReflection (computer Science)Object-oriented Programming LanguageGeneral-purpose Programming LanguageYukihiro MatsumotoJapanPerlSmalltalkEiffel (programming Language)Ada (programming Language)Lisp (programming Language)Programming ParadigmFunctional ProgrammingObject-oriented ProgrammingImperative ProgrammingDynamic TypeMemory ManagementToy LanguagePython (programming Language)Lisp (programming Language)Higher-order FunctionCoralRubyBirthstoneNewsgroupJapanese LanguageObject-oriented ProgrammingClass (computer Science)MixinIteratorClosure (computer Science)Exception HandlingGarbage Collection (computer Science)Programming RubyGovernment Of JapanJapanese Industrial Standards CommitteeInternational Organization For StandardizationRuby On RailsWeb FrameworkLocal VariableBlock (programming)Anonymous FunctionHash TableCharacter EncodingIPv6Lazy EvaluationSemantic VersioningVforkUnicodePpc64Safe Navigation OperatorEnlargeYukihiro MatsumotoUser InterfacePrinciple Of Least AstonishmentPython (programming Language)PerlC++C++Object-orientedInheritance (computer Science)MixinMetaclassDynamic TypingDuck TypingExpression (programming)Statement (programming)Imperative ProgrammingDeclaration (computer Science)Syntactic NoiseDomain-specific LanguagesReflection (computer Science)Dynamic Programming LanguageMetaprogrammingClosure (computer Science)IteratorGenerator (computer Science)Dynamic ArrayAssociative ArrayRegular ExpressionSymbol (Lisp)Variable InterpolationDefault ArgumentGlobal VariableClass VariableInstance VariableLocal VariableSigil (computer Programming)Garbage Collection (computer Science)First-class ContinuationImplicit Type ConversionNull PointerException HandlingOperator OverloadingRational NumberComplex NumberArbitrary-precision ArithmeticThread (computer Science)Fiber (computer Science)YARVUnicodeCharacter EncodingInternational Components For UnicodePlug-in (computing)C (programming Language)Interactive Ruby ShellRead–eval–print LoopRubyGemsYAMLJSONXMLCommon Gateway InterfaceOpenSSLHTTPFTPRSSCurses (programming Library)ZlibTkObject-orientedInteger (computer Science)Null PointerFunction (programming)Method (programming)Inheritance (object-oriented Programming)Dynamic DispatchMixinInstance (computer Science)Multiple InheritanceModule (programming)Multi-paradigm Programming LanguageFunctional ProgrammingAnonymous FunctionClosure (computer Science)ContinuationIntrospection (computer Science)Reflection (computer Science)MetaprogrammingThread (computer Science)Type SystemParametric PolymorphismFAQPerlSmalltalkPython (programming Language)PerlPython (programming Language)Sigil (computer Programming)Expression (programming)Statement (programming)Python (programming Language)PerlC++Java (programming Language)MetaprogrammingC++Java (programming Language)C Sharp (programming Language)VB.NETInteractive Ruby ShellWikipedia:Citing SourcesWikipedia:VerifiabilityHelp:Introduction To Referencing With Wiki Markup/1Wikipedia:VerifiabilityHelp:Maintenance Template RemovalInteractive Ruby ShellHello WorldVariable InterpolationRaw StringArray Data TypeAssociative ArrayClosure (computer Science)Anonymous FunctionClosure (computer Science)FoldlFunctional Programming LanguagesMonkey PatchWikipedia:VerifiabilityHelp:Introduction To Referencing With Wiki Markup/1Help:Maintenance Template RemovalRun Time (program Lifecycle Phase)MetaprogrammingExponentiating By SquaringRuby MRIInterpreter (computer Software)Ruby MRIVirtual MachineRuby MRIC (programming Language)Interpreted LanguageYARVJRubyRubiniusMrubyJust-in-time CompilationAhead-of-time CompilationJRubyJava (programming Language)Java Virtual MachineGraal (compiler)RubiniusC++LLVMMagLev (software)SmalltalkGemstone (database)MrubyLua (programming Language)Yukihiro MatsumotoProprietary SoftwareRPG MakerTranspilerJulia (programming Language)Python (programming Language)JavaScriptMacRubyMacOSObjective-CRubyMotionIronRuby.NET FrameworkParrot Virtual MachineRuby On RailsHotRubyJavaScriptActionScriptRuby Programming LanguageRuby On RailsRuby MRIJRubyRubiniusBSDSony NEWSSunOSLinuxOperating SystemAIXSVR4Solaris (operating System)NECNeXTSTEPClassic Mac OSDOSWindows (operating System)BeOSMacOSWindows PhoneWindows CESymbian OSIBM IRubyGemsIntegrated Development EnvironmentGitHubRevision ControlGit (software)Portal:Free SoftwarePortal:Computer ProgrammingComparison Of Programming LanguagesMetasploit ProjectWhy's (poignant) Guide To RubyXRubyInternational Standard Book NumberSpecial:BookSources/1-4302-2363-4International Standard Book NumberSpecial:BookSources/1-59059-881-4Yukihiro MatsumotoApache SubversionCategory:CS1 Maint: Multiple Names: Authors ListCategory:CS1 Maint: Multiple Names: Authors ListCategory:CS1 Maint: Multiple Names: Authors ListCategory:CS1 Maint: Multiple Names: Authors ListHelp:CS1 ErrorsYouTubeGreen ThreadsAddison-WesleyInternational Standard Book NumberSpecial:BookSources/0-321-72133-0Manning PublicationsInternational Standard Book NumberSpecial:BookSources/1-933988-47-9Pragmatic BookshelfInternational Standard Book NumberSpecial:BookSources/1-934356-08-5Manning PublicationsInternational Standard Book NumberSpecial:BookSources/1-933988-65-7O'Reilly MediaInternational Standard Book NumberSpecial:BookSources/0-596-51617-7No Starch PressInternational Standard Book NumberSpecial:BookSources/1-59327-148-4O'Reilly MediaInternational Standard Book NumberSpecial:BookSources/0-596-52986-4ApressInternational Standard Book NumberSpecial:BookSources/1-59059-766-4Addison-WesleyInternational Standard Book NumberSpecial:BookSources/0-596-52369-6O'Reilly MediaInternational Standard Book NumberSpecial:BookSources/0-596-52369-6REPLDMOZTemplate:Ruby Programming LanguageTemplate Talk:Ruby Programming LanguageProgramming Language ImplementationRuby MRIYARVMrubyJRubyRubiniusMagLev (software)RubyMotionMacRubyIronRubyXRubyRubyJSHotRubyIntegrated Development EnvironmentActiveState KomodoNetBeansRadRailsRubyMineCategory:Free Software Programmed In RubyCapistrano (software)Chef (software)Hackety HackHomebrew (package Management Software)Interactive Ruby ShellPry (software)Puppet (software)Rake (software)RedmineRSpecRubyGemsRuby Version ManagerLibrary (computing)Software FrameworkAdhearsionCamping (microframework)ERubyMerbPadrino (web Framework)RubyCocoaRuby On RailsShoes (GUI Toolkit)Sinatra (software)QtRubyServer (computing)Mod RubyMongrel (web Server)Phusion PassengerRack (web Server Interface)WEBrickYukihiro MatsumotoDavid Heinemeier HanssonWhy The Lucky StiffRuby Document FormatWhy's (poignant) Guide To RubyRuby CentralRubyKaigiRubyForgeRuby LicenseCategory:Ruby (programming Language)Template:Programming LanguagesTemplate Talk:Programming LanguagesProgramming LanguageComparison Of Programming LanguagesTimeline Of Programming LanguagesHistory Of Programming LanguagesAssembly LanguageBASICC (programming Language)C++C Sharp (programming Language)COBOLFortranGo (programming Language)Groovy (programming Language)Haskell (programming Language)Java (programming Language)JavaScriptKotlin (programming Language)Lisp (programming Language)Lua (programming Language)Objective-CPascal (programming Language)PerlPHPPython (programming Language)RexxRust (programming Language)Shell ScriptSmalltalkSwift (programming Language)Visual Basic .NETVBScriptList Of Programming LanguagesCategory:Programming LanguagesList Of Programming LanguagesList Of Programming Languages By TypeGenerational List Of Programming LanguagesNon-English-based Programming LanguagesTemplate:FOSSTemplate Talk:FOSSFree And Open-source SoftwareAlternative Terms For Free SoftwareComparison Of Open-source And Closed-source SoftwareComparison Of Source Code Hosting FacilitiesFree SoftwareList Of Free Software Project DirectoriesGratis Versus LibreLong-term SupportOpen-source SoftwareOpen-source Software DevelopmentOutline Of Free SoftwareList Of Free And Open-source Software PackagesComparison Of Free Software For AudioList Of Open-source Bioinformatics SoftwareList Of Open-source CodecsList Of Collaborative SoftwareComparison Of Open-source Configuration Management SoftwareDevice DriverFree And Open-source Graphics Device DriverComparison Of Open-source Wireless DriversComparison Of Free Geophysics SoftwareList Of Open-source Health SoftwareList Of Open-source Software For MathematicsComparison Of Open-source Operating SystemsComparison Of Open-source Programming Language LicensingList Of Open-source Routing PlatformsList Of Statistical PackagesList Of Free Television SoftwareList Of Open-source Video GamesList Of Free Software Web ApplicationsList Of Content Management SystemsComparison Of Shopping Cart SoftwareList Of Word ProcessorsList Of Free And Open-source Android ApplicationsList Of Free And Open-source IOS ApplicationsList Of Commercial Open-source Applications And ServicesList Of Trademarked Open-source SoftwareList Of Formerly Proprietary SoftwareFree Software MovementHistory Of Free And Open-source SoftwareOpen-source Software MovementList Of Free And Open-source Software OrganizationsList Of Free-software EventsFree Software LicenseAcademic Free LicenseApache LicenseApple Public Source LicenseArtistic LicenseBeerwareBoost Software LicenseBSD LicensesCreative Commons LicenseCommon Development And Distribution LicenseEclipse Public LicenseGNU General Public LicenseGNU Lesser General Public LicenseISC LicenseMIT LicenseMozilla Public LicenseShared SourcePython LicensePython Software Foundation LicenseSleepycat LicenseUnlicenseWTFPLZlib LicenseComparison Of Free And Open-source Software LicensesContributor License AgreementCopyleftDebian Free Software GuidelinesDefinition Of Free Cultural WorksFree LicenseThe Free Software DefinitionThe Open Source DefinitionOpen-source LicensePermissive Software LicencePublic DomainViral LicenseBinary BlobDigital Rights ManagementHardware RestrictionLicense ProliferationMozilla Software Rebranded By DebianProprietary SoftwareSCO/Linux ControversiesUEFI Secure BootSoftware Patents And Free SoftwareOpen-source Software SecurityTrusted ComputingThe Cathedral And The BazaarFork (software Development)Microsoft Open Specification PromiseRevolution OSBook:Free And Open Source SoftwareCategory:Free SoftwarePortal:Free SoftwareTemplate:ISO StandardsTemplate Talk:ISO StandardsInternational Organization For StandardizationList Of International Organization For Standardization StandardsList Of ISO RomanizationsList Of IEC StandardsISO 1ISO 2Preferred NumberISO 4ISO 5ISO 6ISO 7ISO 9A440 (pitch Standard)ISO 31ISO 31-0ISO 31-1ISO 31-2ISO 31-3ISO 31-4ISO 31-5ISO 31-6ISO 31-7ISO 31-8ISO 31-9ISO 31-10ISO 31-11ISO 31-12ISO 31-13ISO 128ISO 216ISO 217ISO 226British Standard Pipe ThreadISO 233ISO 259EnvelopeKappa NumberVicat Softening PointISO 428ISO 518ISO 519ISO 639ISO 639-1ISO 639-2ISO 639-3ISO 639-5ISO 639-6ISO/IEC 646ISO 690ISO 732Antimagnetic WatchISO 843ISO 898ISO 965ISO 1000Magnetic Ink Character Recognition135 FilmOCR-A FontISO 1413ALGOL 60ISO 1745ISO 1989ISO 2014ISO 2015ISO/IEC 2022ISO 2047International Standard Book NumberISO 2145ISO 2146ISO 2240Water Resistant MarkISO 2709ISO 2711ISO 2788ISO 2848ISO 2852126 FilmISO 3103ISO 3166ISO 3166-1ISO 3166-2ISO 3166-3International Standard Serial NumberISO 3307Kunrei-shiki RomanizationISO 3864International Standard Recording CodeISO 3977ISO 4031ISO 4157ISO 4217ISO/IEC 4909ISO/IEC 5218ISO 5428ISO 5775ISO 5776ISO 5800ISO 5964ISO 6166ISO 6344ISO 6346ISO 6385Water Resistant MarkANSI Escape CodeISO 6438ISO 6523ISO 6709ISO 7001ISO 7002PinyinPascal (programming Language)ISO 7200OSI ModelISO 7736ISO/IEC 7810ISO/IEC 7811ISO/IEC 7812ISO/IEC 7813ISO/IEC 7816ISO 8000ISO 8178Fuel OilFTAMISO 8583ISO 8601Computer Graphics MetafileISO/IEC 8652ISO 8691Language Of Temporal Ordering SpecificationISO/IEC 8820-5ISO/IEC 8859ISO/IEC 8859-1ISO/IEC 8859-2ISO/IEC 8859-3ISO/IEC 8859-4ISO/IEC 8859-5ISO/IEC 8859-6ISO/IEC 8859-7ISO/IEC 8859-8ISO-8859-8-IISO/IEC 8859-9ISO/IEC 8859-10ISO/IEC 8859-11ISO/IEC 8859-12ISO/IEC 8859-13ISO/IEC 8859-14ISO/IEC 8859-15ISO/IEC 8859-16Standard Generalized Markup LanguageISO 9000SQLISO/IEC 9126File Allocation TableISO 9241ISO 9362Shoe SizeManufacturing Message SpecificationISO 9529ISO 9564X.500ISO 9660ISO 9897C (programming Language)POSIXISO 9984ISO 9985ISO/IEC 9995ISO 10005ISO 10006ISO 10007ISO/IEC 10116Whirlpool (cryptography)ISO 10160ISO 10161Guidelines For The Definition Of Managed ObjectsDocument Style Semantics And Specification LanguageISO 10206ISO 10218ISO 10303EXPRESS (data Modeling Language)ISO 10303-21ISO 10303-22ISO 10303-28STEP-NCISO 10383ISO 10487ArmSCIIIS-ISUniversal Coded Character SetTorxRM-ODPMultibusInternational Standard Music NumberISO 10962ISO/IEC 10967ISO/IEEE 11073ISO 11170ISO/IEC 11179ISO/IEC 11404JBIGISO 11783ISO 11784 & 11785ISO 11784 & 11785ISO/IEC 11801ISO 11898ISO 11940ISO 11940-2ISO/TR 11941ISO/TR 11941ISO 11992ISO 12006ISO/IEC TR 12182ISO/IEC 12207Tag Image File Format / Electronic PhotographyPrologPrologPrologIsofixTopic MapsISO 13399ISO 13406-2110 FilmISO 13485ISO 13490ISO 13567Z NotationISO 13584International Bank Account NumberISO 14000ISO 14031ISO 14224PDF/UAHorsepowerISO/IEC 14443MPEG-4MPEG-4 Part 2MPEG-4 Part 3Delivery Multimedia Integration FrameworkH.264/MPEG-4 AVCMPEG-4 Part 11MPEG-4 Part 12MPEG-4 Part 14MPEG-4 Part 14MPEG-4 Part 14ISO 14644STEP-NCISO 14651ISO 14698ISO 14750Software MaintenanceC++ISO 14971ISO 15022ISO 15189ISO/IEC 15288Ada Semantic Interface SpecificationISO 15292ISO 15398Common CriteriaJPEG 2000Motion JPEG 2000HTMLPDF417ISO/IEC 15504International Standard Identifier For Libraries And Related OrganizationsISO 15686ISO/IEC 15693International Standard Audiovisual NumberISO 15706-2International Standard Musical Work CodeISO 15897ISO 15919ISO 15924ISO 15926ISO 15926 WIPPDF/XMaxiCodeECMAScriptPDF/VTISO 16750ISO/TS 16949ISO/IEC 17024ISO/IEC 17025ISO 17100:2015Open Virtualization FormatSDMXLegal Entity IdentifierISO/IEC 27002ISO/IEC 18000QR CodeISO/IEC 18014ISO 18245Process Specification LanguagePhotographic Activity TestPDF/AISO 19011ISO 19092-1ISO 19092-2ISO 19114ISO 19115Simple Feature AccessISO 19136ISO 19439Common Object Request Broker ArchitectureUnified Modeling LanguageMeta-Object FacilityXML Metadata InterchangeUnified Modeling LanguageKnowledge Discovery MetamodelObject Constraint LanguageMeta-Object FacilityXML Metadata InterchangeBusiness Process Model And NotationISO 19600:2014ISO/IEC 19752RELAX NGISO/IEC 19770X3DISO/IEC 19794-5Cloud Infrastructure Management InterfaceISO/IEC 20000ISO 20022ISO 20121ISO 20400MPEG-21International Standard Text CodeISO 21500ISO/IEC 21827ISO 22000C Sharp (programming Language)Common Language InfrastructureLinux Standard BasePDF/ELexical Markup FrameworkISO-TimeMLCommon LogicISO 25178ISO 25964ISO 26000OpenDocumentDigital Object IdentifierISO/IEC 27000-seriesISO/IEC 27000ISO/IEC 27001ISO/IEC 27002ISO/IEC 27006International Standard Name IdentifierISO 28000ISO 29110Requirements EngineeringJPEG XROffice Open XMLISO 31000Portable Document FormatISO/IEC 38500Web Content Accessibility GuidelinesISO/IEC 42010ISO 55000ISO/IEC 80000ISO 80000-1ISO 80000-2ISO 80000-3Category:ISO StandardsHelp:Authority ControlLibrary Of Congress Control NumberIntegrated Authority FileSystème Universitaire De DocumentationBibliothèque Nationale De FranceBiblioteca Nacional De EspañaHelp:CategoryCategory:Ruby (programming Language)Category:Articles With Example Ruby CodeCategory:Class-based Programming LanguagesCategory:Dynamic Programming LanguagesCategory:Dynamically Typed Programming LanguagesCategory:Free Software Programmed In CCategory:ISO StandardsCategory:Object-oriented Programming LanguagesCategory:Programming Languages Created In 1995Category:Programming Languages With An ISO StandardCategory:Scripting LanguagesCategory:Software Using The BSD LicenseCategory:Text-oriented Programming LanguagesCategory:Free Compilers And InterpretersCategory:CS1 Maint: Multiple Names: Authors ListCategory:Pages With Citations Lacking TitlesCategory:Pages With Citations Having Bare URLsCategory:Pages Using Deprecated Image SyntaxCategory:Articles Needing Additional References From January 2014Category:All Articles Needing Additional ReferencesCategory:Articles Containing Potentially Dated Statements From 2018Category:All Articles Containing Potentially Dated StatementsCategory:Official Website Different In Wikidata And WikipediaCategory:Articles With Curlie LinksCategory:Wikipedia Articles With LCCN IdentifiersCategory:Wikipedia Articles With GND IdentifiersCategory:Wikipedia Articles With BNF IdentifiersDiscussion About Edits From This IP Address [n]A List Of Edits Made From This IP Address [y]View The Content Page [c]Discussion About The Content Page [t]Edit This Page [e]Visit The Main Page [z]Guides To Browsing WikipediaFeatured Content – The Best Of WikipediaFind Background Information On Current EventsLoad A Random Article [x]Guidance On How To Use And Edit WikipediaFind Out About WikipediaAbout The Project, What You Can Do, Where To Find ThingsA List Of Recent Changes In The Wiki [r]List Of All English Wikipedia Pages Containing Links To This Page [j]Recent Changes In Pages Linked From This Page [k]Upload Files [u]A List Of All Special Pages [q]Wikipedia:AboutWikipedia:General Disclaimer



view link view link view link view link view link