ରୁବୀ (ପ୍ରୋଗ୍ରାମିଂ ଭାଷା)

(Ruby (programming language) ରୁ ଲେଉଟି ଆସିଛି)

ରୁବୀ ଏକ କମ୍ପ୍ୟୁଟର ପ୍ରୋଗ୍ରାମିଂ ଭାଷା ଅଟେ । ଏହାକୁ ୧୯୯୦ର ମଧ୍ୟ ଭାଗରେ ଯୁକିହୀରୋ "ମାଜ୍" ମାସୁମୋଟୋ ଜାପାନରେ ତିଆରି କରିଥିଲେ । ରୁବୀ ପ୍ରୋଗ୍ରାମିଂ ଭାଷାର ସିଣ୍ଟାକ୍‌ସ୍ ଗୁଡ଼ିକ ପର୍ଲ୍ଦ୍ୱାରା ପ୍ରେରିତ ଅଟେ । ଏଥିରେ ଏଇଫିଲ୍ଲିସପ୍‌ର ପ୍ରଭାବ ରହିଅଛି ।

Ruby logo.svg
ପାରାଡ଼ିଜିମ୍‌multi-paradigm: object-oriented, imperative, functional, reflective
ପ୍ରଥମେ ଦେଖାଯାଇଥିଲା1995
ଡିଜାଇନ କରିଥିଲେYukihiro Matsumoto
ବିକାଶକYukihiro Matsumoto, et al.
ସ୍ଥାୟୀ ରିଲିଜ2.0.0-p353 (ଛାଞ୍ଚ:Release date)
ଟାଇପିଂ ପଦ୍ଧତିduck, dynamic
ସୁଯୋଗlexical, sometimes dynamic
ପ୍ରମୁଖ ବ୍ୟବହାରRuby MRI, YARV, Rubinius, MagLev, JRuby, MacRuby, RubyMotion, HotRuby, IronRuby, mruby
ଏହାକୁ ପ୍ରଭାବିତ କରିଛନ୍ତିAda,[୧] C++,[୧] CLU,[୨] Dylan,[୨] Eiffel,[୧] Lisp,[୨] Perl,[୨] Python,[୨] Smalltalk[୨]
ଏହା ଦ୍ଵାରା ପ୍ରଭାବିତ ହୋଇଛନ୍ତିD,[୩] Elixir, Falcon, Fancy,[୪] Groovy, Ioke,[୫] Mirah, Nu,[୬] Reia, potion,
ଅପେରେଟିଂ ସିଷ୍ଟମCross-platform
ସତ୍ତ୍ଵRuby License or BSD License[୭][୮]
ଫାଇଲ ଏକ୍ସଟେନ୍‌ସନ୍.rb, .rbw

ଇତିହାସସମ୍ପାଦନ କରନ୍ତୁ

ପ୍ରାରମ୍ଭିକ ସ୍ତରସମ୍ପାଦନ କରନ୍ତୁ

ରୁବୀ ୨.୦୦ସମ୍ପାଦନ କରନ୍ତୁ

ଉଦାହରଣସମ୍ପାଦନ କରନ୍ତୁ

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"


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ସମ୍ପାଦନ କରନ୍ତୁ

There are a variety of ways to define strings in Ruby.

The following assignments are equivalent and support variable interpolation:

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

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ସମ୍ପାଦନ କରନ୍ତୁ

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}"
# 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 {}

Blocks and iteratorsସମ୍ପାଦନ କରନ୍ତୁ

The two syntaxes for creating a code block:

{ puts "Hello, World!" } # note the braces
# or:
  puts "Hello, World!"

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
# => 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

# Invoke the preceding method, giving it a block which takes a name.
remember {|name| puts "Hello, #{name}!"}

# Call the closure:
@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
  return Proc.new {|x| closure_value = x}, Proc.new { closure_value }

setter, getter = create_set_and_get  # returns two values
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)
  return proc {|x| closure_value = x } , proc { closure_value }

Yielding the flow of program control to a block which was provided at calling time:

def use_hello
  yield "hello"

# 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 Range
(3..6).each {|num| puts num }
# prints:
# 3
# 4
# 5
# 6

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ସମ୍ପାଦନ କରନ୍ତୁ

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
  def <=>(person) # the comparison operator for sorting
    age <=> person.age
  def to_s
    "#{name} (#{age})"

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ସମ୍ପାଦନ କରନ୍ତୁ

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

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. However, if performed recklessly, this practice can lead to collisions of behavior and subsequent unexpected results, and problems with code scalability.

Exceptionsସମ୍ପାଦନ କରନ୍ତୁ

An exception is raised with a raise call:


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 a custom exception class featuring a constructor which takes more than one argument needs to be raised:

class ParseError < Exception
  def initialize input, line, pos
    super "Could not parse '#{input}' at line #{line}, position #{pos}"

raise ParseError.new("Foo", 3, 9)

Exceptions are handled by the rescue clause. Such a clause can catch exceptions which inherit from StandardError. Other flow control keywords that can be used when handling exceptions are else and ensure:

  # do something
  # handle exception
  # do this if no exception was raised
  # do this whether or not an exception was raised

It is a common mistake to attempt to catch all exceptions with a simple rescue clause. To catch all exceptions one must write:

  # do something
rescue Exception
  # Exception handling code here.
  # Don't write only "rescue"; that only catches StandardError, a subclass of Exception.

Or catch particular exceptions:

  # do something
rescue RuntimeError
  # handle only RuntimeError and its subclasses

It is also possible to specify that the exception object be made available to the handler clause:

  # do something
rescue RuntimeError => e
  # handling, possibly involving e, such as "puts e.to_s"

Alternatively, the most recent exception is stored in the magic global $!.

Several exceptions can also be caught:

  # do something
rescue RuntimeError, Timeout::Error => e
  # handling, possibly involving e

Metaprogrammingସମ୍ପାଦନ କରନ୍ତୁ

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>"

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ସମ୍ପାଦନ କରନ୍ତୁ

More sample Ruby code is available as algorithms in the following articles:

ଆଧାରସମ୍ପାଦନ କରନ୍ତୁ

  1. ୧.୦ ୧.୧ ୧.୨ 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.
  2. ୨.୦ ୨.୧ ୨.୨ ୨.୩ ୨.୪ ୨.୫ 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.
  3. Intro – D Programming Language 1.0 – Digital Mars
  4. Bertels, Christopher (23 February 2011). "Introduction to Fancy". Rubinius blog. Engine Yard. Retrieved 2011-07-21.
  5. Bini, Ola. "Ioke". Ioke.org. Retrieved 2011-07-21. inspired by Io, Smalltalk, Lisp and Ruby
  6. Burks, Tim. "About Nu™". Programming Nu™. Neon Design Technology, Inc. Retrieved 2011-07-21.
  7. COPYING in Ruby official source repository
  8. BSDL in Ruby official source repository

ଆହୁରି ପଢନ୍ତୁସମ୍ପାଦନ କରନ୍ତୁ

ବାହାର ଲିଙ୍କସମ୍ପାଦନ କରନ୍ତୁ