Collections
ایجاد و استفاده از یک آرایه:
a = [1, 'hi', 3.14, 1, 2, [4, 5]]
a[2] # 3.14
a.reverse # [[4, 5], 2, 1, 3.14, 'hi', 1]
a.flatten.uniq # [1, 'hi', 3.14, 2, 4, 5]
ایجاد و استفاده از یک هش:
hash = {:water => 'wet', :fire => 'hot'}
puts hash[:fire] # Prints: hot
hash.each_pair do |key, value| # Or: hash.each do |key, value|
puts "#{key} is #{value}"
end
# Prints: water is wet
# fire is hot
hash.delete_if {|key, value| key == :water} # Deletes :water => 'wet'
Blocks and
iterators
هر دو سینتکس برای ایجاد یک بلوک کد:
{ puts "Hello, World!" }
do puts "Hello, World!" end
ارسال پارامتر به یک بلاک تا یک
closure شود:
# In an object instance variable, remember a
block.
def remember(&b)
@block = b
end
# Invoke the above method, giving it a block that takes a name.
remember {|name| puts "Hello, #{name}!"}
# When the time is right (for the object) -- call the closure!
@block.call("John")
# Prints "Hello, John!"
بازگشت closure از یک متد:
def foo(initial_value=0)
var = initial_value
return Proc.new {|x| var = x}, Proc.new { var }
end
setter, getter = foo
setter.call(21)
getter.call # => 21
دادن جریان کنترل یک برنامه به یک بلوک
که در هنگام فراخوانی ایجاد شده:
def a
yield "hello"
end
# Invoke the above method, passing it a block.
a {|s| puts s} # Prints: 'hello'
# Perhaps the following needs cleaning up.
# Breadth-first search
def bfs(e) # 'e' should be a block.
q = [] # Make an array.
e.mark # 'mark' is a user-defined method. (??)
yield e # Yield to the block.
q.push e # Add the block to the array.
while not q.empty? # This could be made much more Ruby-like.
u = q.shift
u.edge_iterator do |v|
if not v.marked? # 'marked?' is a user-defined method.
v.mark
yield v
q.push v
end
end
end
end
bfs(e) {|v| puts v}
ایجاد حلقه بر روی آرایه ها و
enumoration ها با استفاده از بلوکها:
a = [1, 'hi', 3.14]
a.each {|item| puts item} # Prints each element
(3..6).each {|num| puts num} # Prints the numbers 3 through 6
[1,3,5].inject(0) {|sum, element| sum + element} # Prints 9 (you can pass
both a parameter and a block)
بلوکها با بسیاری از متدهای داخلی روبی
کار میکنند:
File.open('file.txt', 'w+b') do |file|
file.puts 'Wrote some text.'
end # File is automatically closed here
یا:
File.readlines('file.txt').each do |line|
# Process each line, here.
end
استفاده از یک enumoration و یک بلوک
برای جذر گرفتن اعداد 1 تا 10:
(1..10).collect {|x| x*x} => [1, 4, 9, 16, 25,
36, 49, 64, 81, 100]
کلاسها
کد زیر یک کلاس بنام Person را تعریف میکند.
class Person
def initialize(name, age)
@name, @age = name, age
end
def <=>(person)
@age <=> person.age
end
def to_s
"#{@name} (#{@age})"
end
attr_reader :name, :age
end
group = [ Person.new("John", 20),
Person.new("Markus", 63),
Person.new("Ash", 16)
]
puts group.sort.reverse
کد بالا سه نام را بر حسب سن از زیاد
به کم چاپ میکند:
Markus (63)
John (20)
Ash (16)