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

ଉଇକିପିଡ଼ିଆ ରୁ
ଏହି ଲେଖାଟି ପ୍ରୋଗ୍ରାମିଂ ଭାଷା ବାବଦରେ । ଅନ୍ୟାନ୍ୟ ବିଷୟ ପାଇଁ, ରୁବୀ (ବହୁବିକଳ୍ପ) ପ୍ରସଙ୍ଗଟି ଦେଖନ୍ତୁ ।
Ruby
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
ୱେବସାଇଟ ruby-lang.org

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

ଇତିହାସ[ସମ୍ପାଦନା]

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

ରୁବୀ ୨.୦୦[ସମ୍ପାଦନା]

ଉଦାହରଣ[ସମ୍ପାଦନା]

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"

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[ସମ୍ପାଦନା]

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
BLOCK

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

Blocks and iterators[ସମ୍ପାଦନା]

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 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 }
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)
  return proc {|x| closure_value = x } , proc { closure_value }
end

Yielding the flow of program control to a block which 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 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
  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[ସମ୍ପାଦନା]

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. 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:

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 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}"
  end
end
 
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:

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[ସମ୍ପାଦନା]

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[ସମ୍ପାଦନା]

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. http://rubini.us/2011/02/23/introduction-to-fancy/. Retrieved 2011-07-21. 
  5. Bini, Ola. "Ioke". Ioke.org. http://ioke.org/. Retrieved 2011-07-21. "inspired by Io, Smalltalk, Lisp and Ruby" 
  6. Burks, Tim. "About Nu™". Programming Nu™. Neon Design Technology, Inc.. http://programming.nu/about. Retrieved 2011-07-21. 
  7. COPYING in Ruby official source repository
  8. BSDL in Ruby official source repository

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

ବାହାର ଲିଙ୍କ[ସମ୍ପାଦନା]