Ruby - Hızlı Kılavuz

Ruby saf bir nesne yönelimli programlama dilidir. 1993 yılında Japonya'dan Yukihiro Matsumoto tarafından oluşturuldu.

Yukihiro Matsumoto adını www.ruby-lang.org adresindeki Ruby posta listesinde bulabilirsiniz . Matsumoto, Ruby topluluğunda Matz olarak da bilinir.

Ruby is "A Programmer's Best Friend".

Ruby, Smalltalk, Perl ve Python'unkilere benzer özelliklere sahiptir. Perl, Python ve Smalltalk komut dosyası dilleridir. Smalltalk gerçek bir nesne yönelimli dildir. Ruby, Smalltalk gibi mükemmel bir nesne yönelimli dildir. Ruby sözdizimini kullanmak, Smalltalk sözdizimini kullanmaktan çok daha kolaydır.

Ruby'nin Özellikleri

  • Ruby açık kaynak kodludur ve Web'de ücretsiz olarak mevcuttur, ancak bir lisansa tabidir.

  • Ruby, genel amaçlı, yorumlanmış bir programlama dilidir.

  • Ruby gerçek bir nesne yönelimli programlama dilidir.

  • Ruby, Python ve PERL'e benzer bir sunucu tarafı kodlama dilidir.

  • Ruby, Common Gateway Interface (CGI) betikleri yazmak için kullanılabilir.

  • Ruby, Hypertext Markup Language (HTML) içine gömülebilir.

  • Ruby, yeni bir geliştiricinin çok hızlı ve kolay bir şekilde öğrenmesini sağlayan temiz ve kolay bir sözdizimine sahiptir.

  • Ruby, C ++ ve Perl gibi birçok programlama diline benzer sözdizimine sahiptir.

  • Ruby çok ölçeklenebilir ve Ruby'de yazılan büyük programların bakımı kolaylıkla yapılabilir.

  • Ruby, İnternet ve intranet uygulamaları geliştirmek için kullanılabilir.

  • Ruby, Windows ve POSIX ortamlarına kurulabilir.

  • Ruby, Tcl / Tk, GTK ve OpenGL gibi birçok GUI aracını destekler.

  • Ruby, DB2, MySQL, Oracle ve Sybase'e kolayca bağlanabilir.

  • Ruby, doğrudan Ruby komut dosyalarına kullanılabilen zengin bir yerleşik işlevler kümesine sahiptir.

İhtiyacınız Olacak Araçlar

Bu eğiticide tartışılan örnekleri gerçekleştirmek için, en az 2 GB RAM (4 GB RAM önerilir) ile Intel Core i3 veya i5 gibi en yeni bir bilgisayara ihtiyacınız olacak. Ayrıca aşağıdaki yazılıma da ihtiyacınız olacak -

  • Linux veya Windows 95/98/2000 / NT veya Windows 7 işletim sistemi.

  • Apache 1.3.19-5 Web sunucusu.

  • Internet Explorer 5.0 veya üzeri Web tarayıcısı.

  • Yakut 1.8.5

Bu eğitici, Ruby kullanarak GUI, ağ oluşturma ve Web uygulamaları oluşturmak için gerekli becerileri sağlayacaktır. Ayrıca Ruby uygulamalarını genişletme ve yerleştirme hakkında da konuşacak.

Sırada ne var?

Sonraki bölüm, Ruby'yi ve belgelerini nereden edinebileceğiniz konusunda size rehberlik edecek. Son olarak, Ruby'nin nasıl kurulacağı ve Ruby uygulamaları geliştirmek için bir ortamın nasıl hazırlanacağı konusunda size talimat verir.

Yerel Ortam Kurulumu

Hala Ruby programlama dili için ortamınızı kurmaya istekli iseniz, devam edelim. Bu eğitim, size ortam kurulumuyla ilgili tüm önemli konuları öğretecektir. Önce aşağıdaki konuları incelemenizi ve ardından ilerlemenizi tavsiye ederiz -

  • Linux / Unix üzerinde Ruby Kurulumu - Geliştirme ortamınızı Linux / Unix Makinesinde yapmayı planlıyorsanız, bu bölümü gözden geçirin.

  • Windows'ta Ruby Kurulumu - Geliştirme ortamınızı Windows Makinede bulundurmayı planlıyorsanız, bu bölüme gidin.

  • Ruby Komut Satırı Seçenekleri - Bu bölüm, Ruby yorumlayıcısı ile birlikte kullanabileceğiniz tüm komut satırı seçeneklerini listeler.

  • Ruby Ortam Değişkenleri - Bu bölümde Ruby Yorumlayıcı'nın çalışması için ayarlanacak tüm önemli ortam değişkenlerinin bir listesi vardır.

Popüler Ruby Editörleri

Ruby programlarınızı yazmak için bir düzenleyiciye ihtiyacınız olacak -

  • Windows makinesinde çalışıyorsanız, Not Defteri veya Edit plus gibi herhangi bir basit metin düzenleyiciyi kullanabilirsiniz.

  • VIM (Vi IMproved) çok basit bir metin editörüdür. Bu hemen hemen tüm Unix makinelerinde ve şimdi Windows'ta da mevcuttur. Aksi takdirde, Ruby programlarını yazmak için favori vi editörünüzü kullanabilirsiniz.

  • RubyWin , Windows için bir Ruby Entegre Geliştirme Ortamıdır (IDE).

  • Ruby Geliştirme Ortamı (RDE) ayrıca Windows kullanıcıları için çok iyi bir IDE'dir.

Etkileşimli Ruby (IRb)

Etkileşimli Ruby (IRb), deneyler için bir kabuk sağlar. IRb kabuğu içinde, ifade sonuçlarını satır satır anında görüntüleyebilirsiniz.

Bu araç Ruby kurulumuyla birlikte gelir, böylece IRb'nin çalışması için fazladan yapabileceğiniz hiçbir şey yoktur.

Sadece yaz irb komut isteminizde ve aşağıda belirtildiği gibi bir Etkileşimli Ruby Oturumu başlayacaktır -

$irb
irb 0.6.1(99/09/16)
irb(main):001:0> def hello
irb(main):002:1> out = "Hello World"
irb(main):003:1> puts out
irb(main):004:1> end
nil
irb(main):005:0> hello
Hello World
nil
irb(main):006:0>

Burada ne yaptığımız konusunda endişelenme. Tüm bu adımları sonraki bölümlerde öğreneceksiniz.

Sırada ne var?

Artık çalışan bir Ruby Ortamınız olduğunu ve ilk Ruby Programını yazmaya hazır olduğunuzu varsayıyoruz. Bir sonraki bölüm size Ruby programlarının nasıl yazılacağını öğretecek.

Ruby'de basit bir program yazalım. Tüm Ruby dosyalarının uzantısı olacaktır.rb. Bu nedenle, aşağıdaki kaynak kodunu bir test.rb dosyasına koyun.

#!/usr/bin/ruby -w

puts "Hello, Ruby!";

Burada, / usr / bin dizininde Ruby yorumlayıcınız olduğunu varsaydık. Şimdi, bu programı aşağıdaki gibi çalıştırmayı deneyin -

$ ruby test.rb

Bu, aşağıdaki sonucu verecektir -

Hello, Ruby!

Basit bir Ruby programı gördünüz, şimdi Ruby Sözdizimi ile ilgili birkaç temel kavramı görelim.

Ruby Programında Boşluk

Boşluklar ve sekmeler gibi boşluk karakterleri, dizelerde göründükleri durumlar dışında, Ruby kodunda genellikle yok sayılır. Ancak bazen belirsiz ifadeleri yorumlamak için kullanılırlar. Bu tür yorumlar, -w seçeneği etkinleştirildiğinde uyarılar üretir.

Misal

a + b is interpreted as a+b ( Here a is a local variable)
a  +b is interpreted as a(+b) ( Here a is a method call)

Ruby Programında Satır Sonları

Ruby, noktalı virgül ve satırsonu karakterlerini bir ifadenin sonu olarak yorumlar. Bununla birlikte, Ruby bir satırın sonunda +, - veya ters eğik çizgi gibi operatörlerle karşılaşırsa, bunlar bir ifadenin devam ettiğini gösterir.

Ruby Tanımlayıcıları

Tanımlayıcılar, değişkenlerin, sabitlerin ve yöntemlerin adlarıdır. Ruby tanımlayıcıları büyük / küçük harfe duyarlıdır. Ram ve RAM'in Ruby'de iki farklı tanımlayıcı olduğu anlamına gelir.

Ruby tanımlayıcı adları alfanümerik karakterlerden ve alt çizgi karakterinden (_) oluşabilir.

Ayrılmış kelimeler

Aşağıdaki liste Ruby'deki ayrılmış kelimeleri göstermektedir. Bu ayrılmış sözcükler sabit veya değişken adlar olarak kullanılamaz. Bununla birlikte, yöntem adları olarak kullanılabilirler.

BAŞLA yapmak Sonraki sonra
SON Başka sıfır doğru
takma ad elsif değil undef
ve son veya sürece
başla sağlamak yeniden yapmak a kadar
kırmak yanlış kurtarmak ne zaman
durum için yeniden dene süre
sınıf Eğer dönüş süre
def içinde kendini __DOSYA__
tanımlı mı? modül Süper __HAT__

Ruby'de Belge

"Here Document", birden çok satırdan dizeler oluşturmayı ifade eder. Bir << 'den sonra, dize değişmezini sonlandırmak için bir dize veya tanımlayıcı belirtebilirsiniz ve mevcut satırı sonlandırıcıya kadar takip eden tüm satırlar, dizenin değeridir.

Sonlandırıcı tırnak içine alınmışsa, tırnak türü satır yönelimli dizge değişmezinin türünü belirler. << ile sonlandırıcı arasında boşluk olmamasına dikkat edin.

İşte farklı örnekler -

#!/usr/bin/ruby -w

print <<EOF
   This is the first way of creating
   here document ie. multiple line string.
EOF

print <<"EOF";                # same as above
   This is the second way of creating
   here document ie. multiple line string.
EOF

print <<`EOC`                 # execute commands
	echo hi there
	echo lo there
EOC

print <<"foo", <<"bar"  # you can stack them
	I said foo.
foo
	I said bar.
bar

Bu, aşağıdaki sonucu verecektir -

This is the first way of creating
   her document ie. multiple line string.
   This is the second way of creating
   her document ie. multiple line string.
hi there
lo there
      I said foo.
      I said bar.

Ruby BEGIN İfadesi

Sözdizimi

BEGIN {
   code
}

Program çalıştırılmadan önce çağrılacak kodu bildirir .

Misal

#!/usr/bin/ruby

puts "This is main Ruby Program"

BEGIN {
   puts "Initializing Ruby Program"
}

Bu, aşağıdaki sonucu verecektir -

Initializing Ruby Program
This is main Ruby Program

Ruby END İfadesi

Sözdizimi

END {
   code
}

Programın sonunda çağrılacak kodu bildirir .

Misal

#!/usr/bin/ruby

puts "This is main Ruby Program"

END {
   puts "Terminating Ruby Program"
}
BEGIN {
   puts "Initializing Ruby Program"
}

Bu, aşağıdaki sonucu verecektir -

Initializing Ruby Program
This is main Ruby Program
Terminating Ruby Program

Ruby Yorumları

Yorum, Ruby yorumlayıcısından bir satırı, bir satırın bir bölümünü veya birkaç satırı gizler. Satır başındaki hash karakterini (#) kullanabilirsiniz -

# I am a comment. Just ignore me.

Veya bir yorum, bir ifade veya ifadeden sonra aynı satırda olabilir -

name = "Madisetti" # This is again comment

Birden çok satırı aşağıdaki gibi yorumlayabilirsiniz -

# This is a comment.
# This is a comment, too.
# This is a comment, too.
# I said that already.

İşte başka bir form. Bu blok açıklaması yorumlayıcıdan = begin / = end - ile birkaç satır gizler

=begin
This is a comment.
This is a comment, too.
This is a comment, too.
I said that already.
=end

Ruby mükemmel bir Nesneye Dayalı Programlama Dilidir. Nesne yönelimli programlama dilinin özellikleri şunları içerir:

  • Veri Kapsülleme
  • Veri soyutlama
  • Polymorphism
  • Inheritance

Bu özellikler, Object Oriented Ruby bölümünde tartışılmıştır .

Nesne yönelimli bir program, sınıfları ve nesneleri içerir. Bir sınıf, tek tek nesnelerin oluşturulduğu plandır. Nesneye yönelik terimlerle, bisikletinizin bisiklet olarak bilinen nesneler sınıfının bir örneği olduğunu söylüyoruz .

Herhangi bir aracın örneğini alın. Tekerlekler, beygir gücü ve yakıt veya gaz tankı kapasitesinden oluşur. Bu özellikler, Araç sınıfının veri üyelerini oluşturur. Bu özelliklerin yardımıyla bir aracı diğerinden ayırt edebilirsiniz.

Bir aracın ayrıca durma, sürüş ve hız yapma gibi belirli işlevleri olabilir. Bu işlevler bile Araç sınıfının veri üyelerini oluşturur. Bu nedenle, bir sınıfı, özelliklerin ve işlevlerin bir kombinasyonu olarak tanımlayabilirsiniz.

Araç sınıfı şu şekilde tanımlanabilir -

Class Vehicle {

   Number no_of_wheels
   Number horsepower
   Characters type_of_tank
   Number Capacity
   Function speeding {
   }
   
   Function driving {
   }
   
   Function halting {
   }
}

Bu veri üyelerine farklı değerler atayarak, Araç sınıfının birkaç örneğini oluşturabilirsiniz. Örneğin, bir uçağın üç tekerleği, 1000 beygir gücü, depo tipi olarak yakıt ve 100 litre kapasitesi vardır. Aynı şekilde bir arabanın dört tekerleği, 200 beygir gücü, depo tipi olarak gaz ve 25 litre kapasitesi vardır.

Ruby'de Sınıf Tanımlama

Ruby kullanarak nesneye dayalı programlamayı uygulamak için, önce Ruby'de nesneler ve sınıflar oluşturmayı öğrenmeniz gerekir.

Ruby'de bir sınıf her zaman class anahtar sözcüğüyle başlar ve ardından sınıfın adı gelir. İsim her zaman büyük harflerle yazılmalıdır. Müşteri sınıfı şu şekilde görüntülenebilir -

class Customer
end

End anahtar sözcüğünü kullanarak bir sınıfı sonlandırırsınız . Sınıftaki tüm veri üyeleri , sınıf tanımı ile end anahtar sözcüğü arasındadır.

Ruby Sınıfındaki Değişkenler

Ruby dört tür değişken sağlar -

  • Local Variables- Yerel değişkenler, bir yöntemde tanımlanan değişkenlerdir. Yerel değişkenler yöntemin dışında kullanılamaz. Sonraki bölümde yöntem hakkında daha fazla ayrıntı göreceksiniz. Yerel değişkenler küçük harf veya _ ile başlar.

  • Instance Variables- Örnek değişkenleri, herhangi bir belirli örnek veya nesne için yöntemler arasında kullanılabilir. Bu, örnek değişkenlerinin nesneden nesneye değiştiği anlamına gelir. Örnek değişkenlerinin başında @ işareti ve ardından değişken adı gelir.

  • Class Variables- Sınıf değişkenleri farklı nesnelerde mevcuttur. Bir sınıf değişkeni sınıfa aittir ve bir sınıfın özelliğidir. Önlerinde @@ işareti bulunur ve ardından değişken adı gelir.

  • Global Variables- Sınıf değişkenleri, sınıflar arasında kullanılamaz. Sınıflar arasında kullanılabilen tek bir değişkene sahip olmak istiyorsanız, bir global değişken tanımlamanız gerekir. Global değişkenlerin önünde her zaman dolar işareti ($) bulunur.

Misal

@@ no_of_customers sınıf değişkenini kullanarak, yaratılmakta olan nesnelerin sayısını belirleyebilirsiniz. Bu, müşteri sayısını elde etmeyi sağlar.

class Customer
   @@no_of_customers = 0
end

Ruby'de Yeni Yöntem Kullanarak Nesne Oluşturma

Nesneler, sınıfın örnekleridir. Şimdi Ruby'de bir sınıfın nesnelerini nasıl yaratacağınızı öğreneceksiniz. Ruby'de sınıfın new yöntemini kullanarak nesneler oluşturabilirsiniz .

Yöntem yeni Yakut kütüphane önceden tanımlanmış olan yönteme eşsiz bir türüdür. Yeni yöntem, sınıf yöntemlerine aittir .

Burada, Customer sınıfının cust1 ve cust2 adlı iki nesnesini oluşturma örneği verilmiştir -

cust1 = Customer. new
cust2 = Customer. new

Burada cust1 ve cust2 iki nesnenin isimleridir. Nesne adını ve ardından eşittir işaretini (=) yazarsınız, ardından sınıf adı gelir. Ardından nokta operatörü ve yeni anahtar kelime gelecektir.

Ruby Nesneleri Oluşturmak için Özel Yöntem

Yeni yönteme parametreler iletebilirsiniz ve bu parametreler sınıf değişkenlerini başlatmak için kullanılabilir.

Yeni yöntemi parametrelerle bildirmeyi planladığınızda , yöntemi sınıf oluşturma sırasında başlatmanız gerekir .

İnitialize yöntemi zaman çalıştırılacaktır yöntemin özel bir tipidir yeni sınıfın yöntem parametreleri ile çağrılır.

Başlatma yöntemini oluşturmak için örnek şu şekildedir -

class Customer
   @@no_of_customers = 0
   def initialize(id, name, addr)
      @cust_id = id
      @cust_name = name
      @cust_addr = addr
   end
end

Bu örnekte, initialize yöntemini şu şekilde bildirirsiniz:id, name, ve addryerel değişkenler olarak. Burada, def ve end , bir Ruby yöntemini ilklendirmek için kullanılır . Sonraki bölümlerde yöntemler hakkında daha fazla bilgi edineceksiniz.

Gelen initialize yöntemle, sen @cust_name ve @cust_addr, @cust_id örnek değişkenleri bu yerel değişkenlerin değerler ileten. Burada yerel değişkenler, yeni yöntemle birlikte iletilen değerleri tutar.

Şimdi, aşağıdaki gibi nesneler oluşturabilirsiniz -

cust1 = Customer.new("1", "John", "Wisdom Apartments, Ludhiya")
cust2 = Customer.new("2", "Poul", "New Empire road, Khandala")

Ruby Sınıfındaki Üye İşlevleri

Ruby'de işlevlere yöntemler denir. Bir sınıftaki her yöntem, def anahtar sözcüğüyle başlar ve ardından yöntem adı gelir.

Yöntem adı her zaman tercih edilir lowercase letters. Ruby'de bir yöntemi end anahtar sözcüğünü kullanarak sonlandırırsınız .

Ruby yöntemini tanımlayan örnek şu şekildedir -

class Sample
   def function
      statement 1
      statement 2
   end
end

Burada ifade 1 ve ifade 2 , Sample sınıfı içindeki yöntem işlevinin gövdesinin bir parçasıdır . Bu ifadeler herhangi bir geçerli Ruby ifadesi olabilir. Örneğin bir yöntem koyabilirsiniz koyar yazdırmak için Merhaba Ruby şöyle -

class Sample
   def hello
      puts "Hello Ruby!"
   end
end

Şimdi aşağıdaki örnekte, bir Sample sınıfı nesnesi oluşturun ve merhaba yöntemini çağırın ve sonucu görün -

#!/usr/bin/ruby

class Sample
   def hello
      puts "Hello Ruby!"
   end
end

# Now using above class to create objects
object = Sample. new
object.hello

Bu, aşağıdaki sonucu verecektir -

Hello Ruby!

Basit Örnek Olay İncelemesi

Sınıf ve nesnelerle daha fazla pratik yapmak istiyorsanız işte bir örnek olay.

Ruby Sınıfı Örnek Olay İncelemesi

Değişkenler, herhangi bir program tarafından kullanılacak herhangi bir veriyi tutan hafıza yerleridir.

Ruby tarafından desteklenen beş tür değişken vardır. Bir önceki bölümde de bu değişkenlerin küçük bir açıklamasından geçtiniz. Bu beş tür değişken bu bölümde açıklanmıştır.

Ruby Global Değişkenleri

Global değişkenler $ ile başlar. İlklendirilmemiş global değişkenler nil değerine sahiptir ve -w seçeneği ile uyarılar üretir.

Global değişkenlere atama, global durumu değiştirir. Global değişkenlerin kullanılması tavsiye edilmez. Programları şifreli yaparlar.

İşte global değişkenin kullanımını gösteren bir örnek.

#!/usr/bin/ruby

$global_variable = 10 class Class1 def print_global puts "Global variable in Class1 is #$global_variable"
   end
end
class Class2
   def print_global
      puts "Global variable in Class2 is #$global_variable"
   end
end

class1obj = Class1.new
class1obj.print_global
class2obj = Class2.new
class2obj.print_global

Burada $ global_variable global bir değişkendir. Bu, aşağıdaki sonucu verecektir -

NOTE - Ruby'de, herhangi bir değişkenin veya sabitin değerine, o değişkenin veya sabitin hemen önüne bir hash (#) karakteri koyarak erişebilirsiniz.

Global variable in Class1 is 10
Global variable in Class2 is 10

Ruby Örneği Değişkenleri

Örnek değişkenleri @ ile başlar. Başlatılmamış örnek değişkenleri nil değerine sahiptir ve -w seçeneğiyle uyarılar üretir.

Örnek Değişkenlerin kullanımını gösteren bir örnek aşağıda verilmiştir.

#!/usr/bin/ruby

class Customer
   def initialize(id, name, addr)
      @cust_id = id
      @cust_name = name
      @cust_addr = addr
   end
   def display_details()
      puts "Customer id #@cust_id"
      puts "Customer name #@cust_name"
      puts "Customer address #@cust_addr"
   end
end

# Create Objects
cust1 = Customer.new("1", "John", "Wisdom Apartments, Ludhiya")
cust2 = Customer.new("2", "Poul", "New Empire road, Khandala")

# Call Methods
cust1.display_details()
cust2.display_details()

Burada @cust_id, @cust_name ve @cust_addr örnek değişkenlerdir. Bu, aşağıdaki sonucu verecektir -

Customer id 1
Customer name John
Customer address Wisdom Apartments, Ludhiya
Customer id 2
Customer name Poul
Customer address New Empire road, Khandala

Ruby Sınıfı Değişkenleri

Sınıf değişkenleri @@ ile başlar ve yöntem tanımlarında kullanılmadan önce başlatılmalıdır.

Başlatılmamış bir sınıf değişkenine başvurmak bir hata oluşturur. Sınıf değişkenleri, sınıf değişkenlerinin tanımlandığı sınıfın veya modülün soyundan gelenler arasında paylaşılır.

Sınıf değişkenlerini geçersiz kılmak, -w seçeneğiyle uyarılar üretir.

İşte sınıf değişkeninin kullanımını gösteren bir örnek -

#!/usr/bin/ruby

class Customer
   @@no_of_customers = 0
   def initialize(id, name, addr)
      @cust_id = id
      @cust_name = name
      @cust_addr = addr
   end
   def display_details()
      puts "Customer id #@cust_id"
      puts "Customer name #@cust_name"
      puts "Customer address #@cust_addr"
   end
   def total_no_of_customers()
      @@no_of_customers += 1
      puts "Total number of customers: #@@no_of_customers"
   end
end

# Create Objects
cust1 = Customer.new("1", "John", "Wisdom Apartments, Ludhiya")
cust2 = Customer.new("2", "Poul", "New Empire road, Khandala")

# Call Methods
cust1.total_no_of_customers()
cust2.total_no_of_customers()

Burada @@ no_of_customers bir sınıf değişkenidir. Bu, aşağıdaki sonucu verecektir -

Total number of customers: 1
Total number of customers: 2

Ruby Yerel Değişkenleri

Yerel değişkenler küçük harf veya _ ile başlar. Yerel bir değişkenin kapsamı, sınıf, modül, def veya do'dan karşılık gelen uca veya bir bloğun açılış ayracından yakın ayracına {} kadar değişir.

Başlatılmamış bir yerel değişkene başvurulduğunda, bağımsız değişken içermeyen bir yönteme yapılan çağrı olarak yorumlanır.

Başlatılmamış yerel değişkenlere atama da değişken bildirimi olarak işlev görür. Değişkenler, geçerli kapsamın sonuna ulaşılana kadar var olmaya başlar. Yerel değişkenlerin yaşam süresi, Ruby programı ayrıştırdığında belirlenir.

Yukarıdaki örnekte, yerel değişkenler id, name ve addr'dir.

Ruby Sabitleri

Sabitler büyük harfle başlar. Bir sınıf veya modül içinde tanımlanan sabitlere, o sınıf veya modül içinden erişilebilir ve bir sınıf veya modül dışında tanımlananlara genel olarak erişilebilir.

Sabitler, yöntemler içinde tanımlanamaz. Başlatılmamış bir sabite başvurmak bir hata oluşturur. Zaten başlatılmış bir sabite atama yapmak bir uyarı oluşturur.

#!/usr/bin/ruby

class Example
   VAR1 = 100
   VAR2 = 200
   def show
      puts "Value of first Constant is #{VAR1}"
      puts "Value of second Constant is #{VAR2}"
   end
end

# Create Objects
object = Example.new()
object.show

Burada VAR1 ve VAR2 sabitlerdir. Bu, aşağıdaki sonucu verecektir -

Value of first Constant is 100
Value of second Constant is 200

Ruby Sözde Değişkenleri

Yerel değişkenlerin görünümüne sahip olan ancak sabitler gibi davranan özel değişkenlerdir. Bu değişkenlere herhangi bir değer atayamazsınız.

  • self - Geçerli yöntemin alıcı nesnesi.

  • true - Doğruyu temsil eden değer.

  • false - Yanlışı temsil eden değer.

  • nil - Tanımsız olanı temsil eden değer.

  • __FILE__ - Mevcut kaynak dosyanın adı.

  • __LINE__ - Kaynak dosyadaki geçerli satır numarası.

Ruby Temel Değişmezleri

Ruby'nin değişmez değerler için kullandığı kurallar basit ve sezgiseldir. Bu bölümde tüm temel Ruby Literatürü açıklanmaktadır.

Tam Sayılar

Ruby tam sayıları destekler. Bir tam sayı -2 uzanabilir 30 2 30-1 veya -2 62 2 62-1 . Bu aralıktaki tam sayılar Fixnum sınıfının nesneleridir ve bu aralığın dışındaki tamsayılar Bignum sınıfındaki nesnelerde saklanır .

Tamsayıları isteğe bağlı bir işaret, isteğe bağlı bir temel gösterge (sekizlik için 0, onaltılık için 0x veya ikili için 0b) ve ardından uygun tabanda bir rakam dizisi kullanarak yazarsınız. Alt çizgi karakterler, rakam dizesinde yok sayılır.

Ayrıca bir ASCII karakterine karşılık gelen tamsayı değerini alabilir veya önüne bir soru işareti koyarak diziden kaçabilirsiniz.

Misal

123                  # Fixnum decimal
1_234                # Fixnum decimal with underline
-500                 # Negative Fixnum
0377                 # octal
0xff                 # hexadecimal
0b1011               # binary
?a                   # character code for 'a'
?\n                  # code for a newline (0x0a)
12345678901234567890 # Bignum

NOTE - Sınıf ve Nesneler, bu eğitimin ayrı bir bölümünde açıklanmıştır.

Kayan Sayılar

Ruby, kayan sayıları destekler. Aynı zamanda sayılardır, ancak ondalık sayılar vardır. Kayan noktalı sayılar Float sınıfının nesneleridir ve aşağıdakilerden herhangi biri olabilir -

Misal

123.4                # floating point value
1.0e6                # scientific notation
4E20                 # dot not required
4e+20                # sign before exponential

Dize Değişmezleri

Ruby dizeleri basitçe 8 bitlik bayt dizileridir ve String sınıfının nesneleridir. Çift tırnaklı dizeler değiştirmeye ve ters eğik çizgiye izin verir, ancak tek tırnaklı dizeler değiştirmeye izin vermez ve yalnızca \\ ve \ 'için ters eğik çizgi gösterimine izin verir

Misal

#!/usr/bin/ruby -w

puts 'escape using "\\"';
puts 'That\'s right';

Bu, aşağıdaki sonucu verecektir -

escape using "\"
That's right

Herhangi bir Ruby ifadesinin değerini sırayı kullanarak bir dizeye değiştirebilirsiniz. #{ expr }. Burada ifade, herhangi bir yakut ifade olabilir.

#!/usr/bin/ruby -w

puts "Multiplication Value : #{24*60*60}";

Bu, aşağıdaki sonucu verecektir -

Multiplication Value : 86400

Ters Eğik Çizgi Gösterimleri

Ruby tarafından desteklenen Ters Eğik Çizgi notasyonlarının listesi aşağıdadır -

Gösterim Temsil edilen karakter
\ n Yeni Satır (0x0a)
\ r Satır başı (0x0d)
\ f Form besleme (0x0c)
\ b Geri tuşu (0x08)
\ a Zil (0x07)
\ e Kaçış (0x1b)
\ s Boşluk (0x20)
\ nnn Sekizli gösterim (n 0-7)
\ xnn Onaltılık gösterim (n 0-9, af veya AF)
\ cx, \ Cx Ctrl-x
\ Mx Meta-x (c | 0x80)
\ M- \ Cx Meta-Control-x
\ x Karakter x

Yakut Strings ilgili daha fazla ayrıntı için geçmesi Yakut Strings .

Ruby Dizileri

Ruby Dizisinin değişmezleri, köşeli parantezler arasına virgülle ayrılmış nesne referansları dizisi yerleştirilerek oluşturulur. Sondaki virgül yok sayılır.

Misal

#!/usr/bin/ruby

ary = [  "fred", 10, 3.14, "This is a string", "last element", ]
ary.each do |i|
   puts i
end

Bu, aşağıdaki sonucu verecektir -

fred
10
3.14
This is a string
last element

Ruby Dizileri hakkında daha fazla ayrıntı için Ruby Dizilerini inceleyin .

Ruby Hashes

Değişmez bir Ruby Hash, anahtar ve değer arasına virgül veya => dizisiyle ayraçlar arasına anahtar / değer çiftlerinin bir listesi yerleştirilerek oluşturulur. Sondaki virgül yok sayılır.

Misal

#!/usr/bin/ruby

hsh = colors = { "red" => 0xf00, "green" => 0x0f0, "blue" => 0x00f }
hsh.each do |key, value|
   print key, " is ", value, "\n"
end

Bu, aşağıdaki sonucu verecektir -

red is 3840
green is 240
blue is 15

Yakut sağlamalarının daha fazla ayrıntı için geçmesi Yakut karmaları .

Ruby Serileri

Aralık, başlangıcı ve bitişi olan bir dizi değerden oluşan bir aralığı temsil eder. Aralıklar, s..e ve s ... e değişmezleri kullanılarak veya Range.new ile oluşturulabilir.

.. kullanılarak oluşturulan aralıklar, baştan sona dahil olmak üzere çalışır. ... kullanılarak oluşturulanlar son değeri hariç tutar. Yineleyici olarak kullanıldığında, aralıklar dizideki her değeri döndürür.

Aralık (1..5), 1, 2, 3, 4, 5 değerleri içerdiği anlamına gelir ve aralık (1 ... 5), 1, 2, 3, 4 değerleri içerdiği anlamına gelir.

Misal

#!/usr/bin/ruby

(10..15).each do |n| 
   print n, ' ' 
end

Bu, aşağıdaki sonucu verecektir -

10 11 12 13 14 15

Ruby Aralıkları hakkında daha fazla ayrıntı için Ruby Aralıklarını inceleyin .

Ruby, modern bir dilden bekleyebileceğiniz gibi zengin bir operatör grubunu destekler. Çoğu operatör aslında yöntem çağrılarıdır. Örneğin, a + b, a. + (B) olarak yorumlanır, burada a değişkeni tarafından belirtilen nesnedeki + yöntemi , argümanı olarak b ile çağrılır .

Her operatör için (+ - * /% ** & | ^ << >> && ||), karşılık gelen bir kısaltılmış atama operatörü formu vardır (+ = - = vb.).

Ruby Aritmetik Operatörleri

A değişkeninin 10 ve b değişkeninin 20 olduğunu varsayın, o zaman -

Şebeke Açıklama Misal
+ Ekleme - İşlecin her iki tarafına da değerler ekler. a + b 30 verir
- Çıkarma - Sağ el işleneni sol el işlenenden çıkarır. a - b -10 verir
* Çarpma - Operatörün her iki tarafındaki değerleri çarpar. a * b 200 verir
/ Bölme - Sol el işleneni sağ el işlenene böler. b / a 2 verecek
% Modulus - Sol el işleneni sağ el işlenene böler ve kalanı döndürür. b% a 0 verir
** Üs - Operatörlerde üstel (güç) hesaplama gerçekleştirir. a ** b, 20 üssüne 10 verir

Ruby Karşılaştırma Operatörleri

A değişkeninin 10 ve b değişkeninin 20 olduğunu varsayın, o zaman -

Şebeke Açıklama Misal
== İki işlenenin değerinin eşit olup olmadığını kontrol eder, evet ise koşul doğru olur. (a == b) doğru değil.
! = İki işlenenin değerinin eşit olup olmadığını kontrol eder, değerler eşit değilse koşul doğru olur. (a! = b) doğrudur.
> Sol işlenenin değerinin sağ işlenenin değerinden büyük olup olmadığını kontrol eder, evet ise koşul doğru olur. (a> b) doğru değil.
< Soldaki işlenenin değerinin sağ işlenenin değerinden küçük olup olmadığını kontrol eder, evet ise koşul doğru olur. (a <b) doğrudur.
> = Sol işlenenin değerinin sağ işlenenin değerinden büyük veya ona eşit olup olmadığını kontrol eder, evet ise koşul doğru olur. (a> = b) doğru değil.
<= Sol işlenenin değerinin sağ işlenenin değerinden küçük veya ona eşit olup olmadığını kontrol eder, evet ise koşul doğru olur. (a <= b) doğrudur.
<=> Kombine karşılaştırma operatörü. İlk işlenen saniyeye eşitse 0, ilk işlenen ikinciden büyükse 1 ve ilk işlenen ikinciden küçükse -1 döndürür. (a <=> b) -1 döndürür.
=== Bir case ifadesinin when cümlesi içinde eşitliği test etmek için kullanılır . (1 ... 10) === 5 true değerini döndürür.
.eql? Alıcı ve bağımsız değişken aynı türe ve eşit değerlere sahipse doğrudur. 1 == 1.0 doğru döndürür, ancak 1.eql? (1.0) yanlıştır.
eşit? Alıcı ve bağımsız değişken aynı nesne kimliğine sahipse doğrudur. aObj, bObj'nin kopyasıysa, aObj == bObj doğrudur, a.equal? ​​bObj yanlıştır, ancak a.equal? ​​aObj doğrudur.

Ruby Atama Operatörleri

A değişkeninin 10 ve b değişkeninin 20 olduğunu varsayın, o zaman -

Şebeke Açıklama Misal
= Basit atama operatörü, sağ taraftaki işlenenlerden sol taraftaki işlenenlere değerler atar. c = a + b, a + b'nin değerini c'ye atar
+ = VE atama işleci ekleyin, sağ işleneni sol işlenenlere ekler ve sonucu sol işlenenlere atar. c + = a eşdeğerdir c = c + a
- = VE atama işlecini çıkar, sağ işleneni sol işlenenden çıkarır ve sonucu sol işlenenlere atar. c - = a eşdeğerdir c = c - a
* = AND atama operatörünü çarpın, sağ operandı sol operandla çarpar ve sonucu sol operanda atar. c * = a, c = c * a'ya eşdeğerdir
/ = VE atama işlecini böl, soldaki işleneni sağ işlenenle böler ve sonucu sol işlenenlere atar. c / = a, c = c / a'ya eşdeğerdir
% = Modül VE atama operatörü, iki işlenen kullanarak modülü alır ve sonucu sol operanda atar. c% = a eşdeğerdir c = c% a
** = Üslü AND atama operatörü, operatörler üzerinde üstel (güç) hesaplaması yapar ve sol operanda değer atar. c ** = a eşdeğerdir c = c ** a

Ruby Paralel Ataması

Ruby ayrıca değişkenlerin paralel olarak atanmasını destekler. Bu, birden çok değişkenin tek bir Ruby kodu satırıyla başlatılmasını sağlar. Örneğin -

a = 10
b = 20
c = 30

Bu, paralel atama kullanılarak daha hızlı bildirilebilir -

a, b, c = 10, 20, 30

Paralel atama, iki değişkende tutulan değerleri değiştirmek için de kullanışlıdır -

a, b = b, c

Ruby Bitsel Operatörleri

Bitsel operatör bitler üzerinde çalışır ve bit işlem gerçekleştirir.

Varsayalım ki a = 60; ve b = 13; şimdi ikili biçimde aşağıdaki gibi olacaklar -

a    =  0011 1100
 b    =  0000 1101
 ------------------
 a&b  =  0000 1100
 a|b  =  0011 1101
 a^b  =  0011 0001
 ~a   =  1100 0011

Aşağıdaki Bitwise operatörleri Ruby dili tarafından desteklenmektedir.

Şebeke Açıklama Misal
& İkili VE İşleci, her iki işlenende de varsa sonuca bir bit kopyalar. (a & b) 0000 1100 olan 12 verir
| İkili VEYA İşleci, işlenenlerden herhangi birinde varsa bir bit kopyalar. (a | b), 0011 1101 olan 61 verecek
^ İkili XOR İşleci, bir işlenen içinde ayarlanmışsa, ancak her ikisinde birden ayarlanmamışsa biti kopyalar. (a ^ b), 0011 0001 olan 49 verecek
~ İkili Birler Tamamlayıcı Operatörü tekli ve bitleri 'çevirme' etkisine sahiptir. (~ a), işaretli bir ikili sayı nedeniyle 2'nin tamamlayıcı formunda 1100 0011 olan -61'i verecektir.
<< İkili Sol Kaydırma Operatörü. Soldaki işlenenler değeri, sağ işlenen tarafından belirtilen bit sayısı kadar sola taşınır. a << 2 240 verir, yani 1111 0000
>> İkili Sağ Shift Operatörü. Soldaki işlenenler değeri, sağ işlenen tarafından belirtilen bit sayısı kadar sağa taşınır. a >> 2, 0000 1111 olan 15 verir

Ruby Mantıksal Operatörleri

Aşağıdaki mantıksal operatörler Ruby dili tarafından desteklenmektedir

Varsayalım değişken bir 10 tutar ve değişken b , daha sonra 20 tutar -

Şebeke Açıklama Misal
ve Mantıksal AND operatörü çağrıldı. Her iki işlenen de doğruysa, koşul doğru olur. (a ve b) doğrudur.
veya Mantıksal VEYA Operatörü çağrıldı. İki işlenenden herhangi biri sıfır değilse, koşul doğru olur. (a veya b) doğrudur.
&& Mantıksal AND operatörü çağrıldı. Her iki işlenen de sıfır değilse, koşul doğru olur. (a && b) doğrudur.
|| Mantıksal VEYA Operatörü çağrıldı. İki işlenenden herhangi biri sıfır değilse, koşul doğru olur. (a || b) doğrudur.
! Mantıksal NOT Operatörü olarak adlandırıldı. İşleneninin mantıksal durumunu tersine çevirmek için kullanın. Bir koşul doğruysa, Mantıksal NOT operatörü yanlış yapar. ! (a && b) yanlıştır.
değil Mantıksal NOT Operatörü olarak adlandırıldı. İşleneninin mantıksal durumunu tersine çevirmek için kullanın. Bir koşul doğruysa, Mantıksal NOT operatörü yanlış yapar. not (a && b) yanlıştır.

Ruby Üçlü İşleci

Üçlü Operatör adında bir operatör daha var. Önce doğru veya yanlış değer için bir ifadeyi değerlendirir ve ardından değerlendirmenin sonucuna bağlı olarak verilen iki ifadeden birini yürütür. Koşullu operatör bu sözdizimine sahiptir -

Şebeke Açıklama Misal
? : Koşullu İfade Koşul doğruysa? Ardından X değeri: Aksi takdirde Y değeri

Ruby Aralığı Operatörleri

Ruby'deki sıra aralıkları, bir başlangıç ​​değeri, bir bitiş değeri ve aradaki bir dizi değerden oluşan bir dizi ardışık değer oluşturmak için kullanılır.

Ruby'de bu diziler ".." ve "..." aralık operatörleri kullanılarak oluşturulur. İki noktalı form, kapsayıcı bir aralık oluştururken, üç noktalı form, belirtilen yüksek değeri hariç tutan bir aralık oluşturur.

Şebeke Açıklama Misal
.. Başlangıç ​​noktasından bitiş noktasına kadar dahil bir aralık oluşturur. 1..10 1'den 10'a kadar bir aralık oluşturur.
... Başlangıç ​​noktasından bitiş noktasına özel bir aralık oluşturur. 1 ... 10 1 ile 9 arasında bir aralık oluşturur.

Ruby tanımlandı mı? Operatörler

tanımlı mı? aktarılan ifadenin tanımlanıp tanımlanmadığını belirlemek için bir yöntem çağrısı şeklini alan özel bir operatördür. İfadenin açıklama dizesini döndürür veya ifade tanımlanmamışsa nil döndürür .

Tanımlanmış çeşitli kullanımları vardır? Şebeke

Kullanım 1

defined? variable # True if variable is initialized

For Example

foo = 42
defined? foo    # => "local-variable"
defined? $_     # => "global-variable"
defined? bar    # => nil (undefined)

Kullanım 2

defined? method_call # True if a method is defined

For Example

defined? puts        # => "method"
defined? puts(bar)   # => nil (bar is not defined here)
defined? unpack      # => nil (not defined here)

Kullanım 3

# True if a method exists that can be called with super user
defined? super

For Example

defined? super     # => "super" (if it can be called)
defined? super     # => nil (if it cannot be)

Kullanım 4

defined? yield   # True if a code block has been passed

For Example

defined? yield    # => "yield" (if there is a block passed)
defined? yield    # => nil (if there is no block)

Ruby Dot "." ve Çift İki Nokta "::" Operatörleri

Adından önce modül adı ve bir nokta koyarak bir modül yöntemini çağırırsınız ve modül adını ve iki iki nokta üst üste kullanarak bir sabite başvurursunuz.

:: Bir sınıf veya modül içinde tanımlanan sabitlere, örnek yöntemlerine ve sınıf yöntemlerine, sınıf veya modülün dışındaki herhangi bir yerden erişilmesine izin veren tekli bir operatördür.

Remember Ruby'de sınıflar ve yöntemler de sabitler olarak kabul edilebilir.

Sadece önek olarak :: Uygun sınıf veya modül nesnesini döndüren bir ifade ile Const_name.

Önek ifadesi kullanılmazsa, varsayılan olarak ana Object sınıfı kullanılır.

İşte iki örnek -

MR_COUNT = 0         # constant defined on main Object class
module Foo
   MR_COUNT = 0
   ::MR_COUNT = 1    # set global count to 1
   MR_COUNT = 2      # set local count to 2
end
puts MR_COUNT        # this is the global constant
puts Foo::MR_COUNT   # this is the local "Foo" constant

Second Example

CONST = ' out there'
class Inside_one
   CONST = proc {' in there'}
   def where_is_my_CONST
      ::CONST + ' inside one'
   end
end
class Inside_two
   CONST = ' inside two'
   def where_is_my_CONST
      CONST
   end
end
puts Inside_one.new.where_is_my_CONST
puts Inside_two.new.where_is_my_CONST
puts Object::CONST + Inside_two::CONST
puts Inside_two::CONST + CONST
puts Inside_one::CONST
puts Inside_one::CONST.call + Inside_two::CONST

Ruby Operatörleri Önceliği

Aşağıdaki tablo en yüksek öncelikten en düşüğe doğru tüm operatörleri listeler.

Yöntem Şebeke Açıklama
Evet :: Sabit çözünürlük operatörü
Evet [] [] = Öğe referansı, öğe kümesi
Evet ** Üs alma (kuvvete yükseltme)
Evet ! ~ + - Değil, tamamlayıcı, tekli artı ve eksi (son ikisi için yöntem adları + @ ve - @)
Evet * /% Çarp, böl ve modulo
Evet + - Toplama ve çıkarma
Evet >> << Sağa ve sola bitsel kaydırma
Evet & Bitsel "VE"
Evet ^ | Bit düzeyinde özel "VEYA" ve normal "VEYA"
Evet <= <>> = Karşılaştırma operatörleri
Evet <=> == ===! = = ~! ~ Eşitlik ve örüntü eşleştirme operatörleri (! = Ve! ~ Yöntem olarak tanımlanmayabilir)
  && Mantıksal "VE"
  || Mantıksal "VEYA"
  .. ... Aralık (kapsayıcı ve özel)
  ? : Üçlü eğer-ise-değilse
  =% = {/ = - = + = | = & = >> = << = * = && = || = ** = Görev
  tanımlı mı? Belirtilen sembolün tanımlanıp tanımlanmadığını kontrol edin
  değil Mantıksal olumsuzluk
  veya ve Mantıksal kompozisyon

NOTE- Yöntem sütununda Evet olan işleçler aslında yöntemlerdir ve bu nedenle geçersiz kılınabilir.

Yorumlar, çalışma zamanında göz ardı edilen Ruby kodu içindeki açıklama satırlarıdır. Tek satırlık bir açıklama # karakteriyle başlar ve aşağıdaki gibi # karakterinden satırın sonuna kadar uzanır -

#!/usr/bin/ruby -w
# This is a single line comment.

puts "Hello, Ruby!"

Çalıştırıldığında, yukarıdaki program aşağıdaki sonucu verir -

Hello, Ruby!

Ruby Multiline Yorumları

Kullanarak birden çok satırı yorumlayabilirsiniz =begin ve =end sözdizimi aşağıdaki gibidir -

#!/usr/bin/ruby -w

puts "Hello, Ruby!"

=begin
This is a multiline comment and con spwan as many lines as you
like. But =begin and =end should come in the first line only. 
=end

Çalıştırıldığında, yukarıdaki program aşağıdaki sonucu verir -

Hello, Ruby!

Sondaki yorumların koddan yeterince uzakta olduğundan ve kolayca ayırt edilebildiğinden emin olun. Bir blokta birden fazla takip eden yorum varsa, bunları hizalayın. Örneğin -

@counter      # keeps track times page has been hit
@siteCounter  # keeps track of times all pages have been hit

Ruby, modern dillerde oldukça yaygın olan koşullu yapılar sunar. Burada, Ruby'de bulunan tüm koşullu ifadeleri ve değiştiricileri açıklayacağız.

Ruby if ... else İfadesi

Sözdizimi

if conditional [then]
   code...
[elsif conditional [then]
   code...]...
[else
   code...]
end

Eğer ifadeler koşullu yürütülmesi için kullanılır. False ve nil değerleri yanlıştır ve diğer her şey doğrudur. Ruby'nin elsif kullandığına dikkat edin, else if ne de elif.

Yürütür kod eğer koşullu doğrudur. Eğer koşullu doğru değildir, kod başka fıkrada belirtilen yürütülür.

Bir if ifadesinin koşullu , koddan ayrılmış sözcük, o zaman bir satırsonu veya noktalı virgül ile ayrılır.

Misal

#!/usr/bin/ruby

x = 1
if x > 2
   puts "x is greater than 2"
elsif x <= 2 and x!=0
   puts "x is 1"
else
   puts "I can't guess the number"
end
x is 1

Değiştirici ise Ruby

Sözdizimi

code if condition

Yürütür kod eğer koşullu doğrudur.

Misal

#!/usr/bin/ruby

$debug = 1
print "debug\n" if $debug

Bu, aşağıdaki sonucu verecektir -

debug

Ruby ifadesiz

Sözdizimi

unless conditional [then]
   code
[else
   code ]
end

Çalıştırır kod eğer koşullu yanlıştır. Eğer koşullu doğrudur, başka maddede belirtilen kod yürütülür.

Misal

#!/usr/bin/ruby

x = 1 
unless x>=2
   puts "x is less than 2"
 else
   puts "x is greater than 2"
end

Bu, aşağıdaki sonucu verecektir -

x is less than 2

Değiştirici olmadıkça Ruby

Sözdizimi

code unless conditional

Çalıştırır kod eğer koşullu yanlıştır.

Misal

#!/usr/bin/ruby

$var =  1
print "1 -- Value is set\n" if $var print "2 -- Value is set\n" unless $var

$var = false print "3 -- Value is set\n" unless $var

Bu, aşağıdaki sonucu verecektir -

1 -- Value is set
3 -- Value is set

Ruby case İfadesi

Sözdizimi

case expression
[when expression [, expression ...] [then]
   code ]...
[else
   code ]
end

Durum tarafından belirtilen ifadeyi ve === operatörünü kullanırken tarafından belirtilen ifadeyi karşılaştırır ve eşleşen when cümlesinin kodunu yürütür .

Sentezleme zaman maddesi ile belirtilen sola işlenen olarak değerlendirilir. No when cümleleri eşleşirse, case else cümlesinin kodunu yürütür .

Bir when ifadesinin ifadesi, koddan ayrılmış sözcük, ardından bir satırsonu veya bir noktalı virgül ile ayrılır. Böylece -

case expr0
when expr1, expr2
   stmt1
when expr3, expr4
   stmt2
else
   stmt3
end

temelde aşağıdakine benzer -

_tmp = expr0
if expr1 === _tmp || expr2 === _tmp
   stmt1
elsif expr3 === _tmp || expr4 === _tmp
   stmt2
else
   stmt3
end

Misal

#!/usr/bin/ruby

$age = 5 case $age
when 0 .. 2
   puts "baby"
when 3 .. 6
   puts "little child"
when 7 .. 12
   puts "child"
when 13 .. 18
   puts "youth"
else
   puts "adult"
end

Bu, aşağıdaki sonucu verecektir -

little child

Ruby'deki döngüler, aynı kod bloğunu belirli sayıda çalıştırmak için kullanılır. Bu bölüm, Ruby tarafından desteklenen tüm döngü ifadelerinin ayrıntılarını içerir.

Ruby while İfadesi

Sözdizimi

while conditional [do]
   code
end

Çalıştırır kodu ise koşullu doğrudur. Bir while döngüsünün koşulu , koddan ayrılmış sözcük do, yeni satır, ters eğik çizgi \ veya noktalı virgül; ile ayrılır.

Misal

#!/usr/bin/ruby

$i = 0
$num = 5

while $i < $num  do
   puts("Inside the loop i = #$i" )
   $i +=1
end

Bu, aşağıdaki sonucu verecektir -

Inside the loop i = 0
Inside the loop i = 1
Inside the loop i = 2
Inside the loop i = 3
Inside the loop i = 4

Değiştirici iken Ruby

Sözdizimi

code while condition

OR

begin 
  code 
end while conditional

Çalıştırır kodu ise koşullu doğrudur.

Bir while değiştiricisi , kurtarma veya sağlama yan tümceleri içermeyen bir begin ifadesini takip ederse , koşul değerlendirilmeden önce kod bir kez çalıştırılır.

Misal

#!/usr/bin/ruby

$i = 0
$num = 5
begin
   puts("Inside the loop i = #$i" )
   $i +=1
end while $i < $num

Bu, aşağıdaki sonucu verecektir -

Inside the loop i = 0
Inside the loop i = 1
Inside the loop i = 2
Inside the loop i = 3
Inside the loop i = 4

Ruby İfadeye Kadar

until conditional [do]
   code
end

Çalıştırır kod ise koşullu yanlıştır. Bir until ifadesinin koşulu, koddan ayrılmış olan do , yeni satır veya noktalı virgül ile ayrılır.

Misal

#!/usr/bin/ruby

$i = 0
$num = 5

until $i > $num  do
   puts("Inside the loop i = #$i" )
   $i +=1;
end

Bu, aşağıdaki sonucu verecektir -

Inside the loop i = 0
Inside the loop i = 1
Inside the loop i = 2
Inside the loop i = 3
Inside the loop i = 4
Inside the loop i = 5

Değiştiriciye kadar Ruby

Sözdizimi

code until conditional

OR

begin
   code
end until conditional

Çalıştırır kod ise koşullu yanlıştır.

Bir until değiştirici , kurtarma veya sağlama yan tümceleri içermeyen bir begin deyimini takip ederse , koşul değerlendirilmeden önce kod bir kez çalıştırılır .

Misal

#!/usr/bin/ruby

$i = 0
$num = 5
begin
   puts("Inside the loop i = #$i" )
   $i +=1;
end until $i > $num

Bu, aşağıdaki sonucu verecektir -

Inside the loop i = 0
Inside the loop i = 1
Inside the loop i = 2
Inside the loop i = 3
Inside the loop i = 4
Inside the loop i = 5

Ruby for Statement

Sözdizimi

for variable [, variable ...] in expression [do]
   code
end

Çalıştırır kodu her bir eleman için bir kere ifadesi .

Misal

#!/usr/bin/ruby

for i in 0..5
   puts "Value of local variable is #{i}"
end

Burada 0..5 aralığını tanımladık. İçin deyim i 0..5 yılında sağlayacak ı (5 dahil), 0 ile 5 arasında değerler almaya. Bu, aşağıdaki sonucu verecektir -

Value of local variable is 0
Value of local variable is 1
Value of local variable is 2
Value of local variable is 3
Value of local variable is 4
Value of local variable is 5

Bir for ... in döngüsü neredeyse tam olarak aşağıdakine eşdeğerdir -

(expression).each do |variable[, variable...]| code end

bir for döngüsünün yerel değişkenler için yeni bir kapsam oluşturmaması dışında . Bir for döngüsünün ifadesi , ayrılmış sözcük do, yeni satır veya noktalı virgül ile koddan ayrılır.

Misal

#!/usr/bin/ruby

(0..5).each do |i|
   puts "Value of local variable is #{i}"
end

Bu, aşağıdaki sonucu verecektir -

Value of local variable is 0
Value of local variable is 1
Value of local variable is 2
Value of local variable is 3
Value of local variable is 4
Value of local variable is 5

Ruby break İfadesi

Sözdizimi

break

En dahili döngüyü sonlandırır. Blok içinde çağrılırsa, ilişkili bir blokla bir yöntemi sonlandırır (yöntem sıfır döndürür).

Misal

#!/usr/bin/ruby

for i in 0..5
   if i > 2 then
      break
   end
   puts "Value of local variable is #{i}"
end

Bu, aşağıdaki sonucu verecektir -

Value of local variable is 0
Value of local variable is 1
Value of local variable is 2

Ruby next İfadesi

Sözdizimi

next

En dahili döngünün bir sonraki yinelemesine atlar. Bir blok içinde çağrılırsa bir bloğun yürütülmesini sonlandırır ( getiri veya sıfır dönen çağrı ile ).

Misal

#!/usr/bin/ruby

for i in 0..5
   if i < 2 then
      next
   end
   puts "Value of local variable is #{i}"
end

Bu, aşağıdaki sonucu verecektir -

Value of local variable is 2
Value of local variable is 3
Value of local variable is 4
Value of local variable is 5

Ruby redo İfadesi

Sözdizimi

redo

En dahili döngünün bu yinelemesini, döngü koşulunu kontrol etmeden yeniden başlatır. Bir blok içinde çağrılırsa verimi veya çağrıyı yeniden başlatır .

Misal

#!/usr/bin/ruby

for i in 0..5
   if i < 2 then
      puts "Value of local variable is #{i}"
      redo
   end
end

Bu, aşağıdaki sonucu üretecek ve sonsuz bir döngüye girecek -

Value of local variable is 0
Value of local variable is 0
............................

Ruby yeniden deneme İfadesi

Sözdizimi

retry

Eğer yeniden deneme başlangıcından itibaren ifadesini, yeniden başlamak kurtarma maddesi görünen bedeni başlar.

begin
   do_something # exception raised
rescue
   # handles error
   retry  # restart from beginning
end

For ifadesinin yineleyicide, bloğunda veya gövdesinde yeniden deneme görünürse , yineleyici çağrısının çağrılmasını yeniden başlatır. Yineleyiciye yönelik bağımsız değişkenler yeniden değerlendirilir.

for i in 1..5
   retry if some_condition # restart from i == 1
end

Misal

#!/usr/bin/ruby
for i in 0..5
   retry if i > 2
puts "Value of local variable is #{i}"
end

Bu, aşağıdaki sonucu üretecek ve sonsuz bir döngüye girecek -

Value of local variable is 1
Value of local variable is 2
Value of local variable is 1
Value of local variable is 2
Value of local variable is 1
Value of local variable is 2
............................

Ruby yöntemleri, diğer programlama dillerindeki işlevlere çok benzer. Ruby yöntemleri, bir veya daha fazla tekrarlanabilir ifadeyi tek bir birimde paketlemek için kullanılır.

Yöntem adları küçük harfle başlamalıdır. Bir yöntem adına büyük harfle başlarsanız, Ruby bunun bir sabit olduğunu düşünebilir ve bu nedenle çağrıyı yanlış ayrıştırabilir.

Yöntemler çağırılmadan önce tanımlanmalıdır, aksi takdirde Ruby tanımsız yöntem çağırma için bir istisna oluşturur.

Sözdizimi

def method_name [( [arg [= default]]...[, * arg [, &expr ]])]
   expr..
end

Dolayısıyla, aşağıdaki gibi basit bir yöntem tanımlayabilirsiniz -

def method_name 
   expr..
end

Bunun gibi parametreleri kabul eden bir yöntemi temsil edebilirsiniz -

def method_name (var1, var2)
   expr..
end

Yöntem gerekli parametreleri geçmeden çağrılırsa kullanılacak parametreler için varsayılan değerleri ayarlayabilirsiniz -

def method_name (var1 = value1, var2 = value2)
   expr..
end

Basit yöntemi her çağırdığınızda, yalnızca yöntem adını aşağıdaki gibi yazarsınız -

method_name

Ancak, parametreli bir yöntemi çağırdığınızda, yöntem adını parametrelerle birlikte yazarsınız, örneğin -

method_name 25, 30

Yöntemleri parametrelerle kullanmanın en önemli dezavantajı, bu tür yöntemleri her çağırdığınızda parametrelerin sayısını hatırlamanız gerekmesidir. Örneğin, bir yöntem üç parametreyi kabul ederse ve yalnızca ikisini geçerseniz, Ruby bir hata görüntüler.

Misal

#!/usr/bin/ruby

def test(a1 = "Ruby", a2 = "Perl")
   puts "The programming language is #{a1}"
   puts "The programming language is #{a2}"
end
test "C", "C++"
test

Bu, aşağıdaki sonucu verecektir -

The programming language is C
The programming language is C++
The programming language is Ruby
The programming language is Perl

Yöntemlerden Dönen Değerler

Ruby'deki her yöntem varsayılan olarak bir değer döndürür. Bu döndürülen değer, son ifadenin değeri olacaktır. Örneğin -

def test
   i = 100
   j = 10
   k = 0
end

Bu yöntem çağrıldığında, bildirilen son değişken k'yi döndürür .

Ruby dönüş Bildirimi

Dönüş Ruby ifadesi Ruby Yöntem itibaren bir veya daha fazla değer döndürmek için kullanılır.

Sözdizimi

return [expr[`,' expr...]]

İkiden fazla ifade verilirse, bu değerleri içeren dizi dönüş değeri olacaktır. İfade verilmemişse, dönüş değeri nil olacaktır.

Misal

return

OR

return 12

OR

return 1,2,3

Bu örneğe bir göz atın -

#!/usr/bin/ruby

def test
   i = 100
   j = 200
   k = 300
return i, j, k
end
var = test
puts var

Bu, aşağıdaki sonucu verecektir -

100
200
300

Değişken Parametre Sayısı

Diyelim ki, iki parametre alan bir yöntem tanımladınız, bu yöntemi her çağırdığınızda, onunla birlikte iki parametre iletmeniz gerekir.

Ancak Ruby, değişken sayıda parametrelerle çalışan yöntemleri bildirmenize izin verir. Bunun bir örneğini inceleyelim -

#!/usr/bin/ruby

def sample (*test)
   puts "The number of parameters is #{test.length}"
   for i in 0...test.length
      puts "The parameters are #{test[i]}"
   end
end
sample "Zara", "6", "F"
sample "Mac", "36", "M", "MCA"

Bu kodda, bir parametre testini kabul eden bir yöntem örneği bildirdiniz. Ancak bu parametre değişken bir parametredir. Bu, bu parametrenin herhangi bir sayıda değişkeni alabileceği anlamına gelir. Bu nedenle, yukarıdaki kod aşağıdaki sonucu verecektir -

The number of parameters is 3
The parameters are Zara
The parameters are 6
The parameters are F
The number of parameters is 4
The parameters are Mac
The parameters are 36
The parameters are M
The parameters are MCA

Sınıf Yöntemleri

Sınıf tanımının dışında bir yöntem tanımlandığında, yöntem varsayılan olarak özel olarak işaretlenir . Öte yandan, sınıf tanımında tanımlanan yöntemler varsayılan olarak genel olarak işaretlenir. Yöntemlerin varsayılan görünürlüğü ve özel işareti , Modülün genel veya özel olarak değiştirilebilir .

Bir sınıfın bir yöntemine erişmek istediğinizde, önce sınıfı başlatmanız gerekir. Ardından, nesneyi kullanarak sınıfın herhangi bir üyesine erişebilirsiniz.

Ruby, bir sınıfı somutlaştırmadan bir yönteme erişmenin bir yolunu sunar. Bir sınıf yönteminin nasıl bildirildiğini ve erişildiğini görelim -

class Accounts
   def reading_charge
   end
   def Accounts.return_date
   end
end

Return_date yönteminin nasıl bildirildiğini görün. Sınıf adı ve ardından bir nokta ve ardından yöntemin adı ile bildirilir. Bu sınıf yöntemine doğrudan aşağıdaki şekilde erişebilirsiniz -

Accounts.return_date

Bu yönteme erişmek için, Hesaplar sınıfının nesnelerini oluşturmanız gerekmez.

Ruby takma adı İfadesi

Bu, yöntemlere veya genel değişkenlere takma ad verir. Takma adlar, yöntem gövdesi içinde tanımlanamaz. Yöntemin diğer adı, yöntemler geçersiz kılındığında bile yöntemin mevcut tanımını korur.

Numaralandırılmış global değişkenler ($ 1, $ 2, ...) için takma adlar yapmak yasaktır. Yerleşik genel değişkenlerin geçersiz kılınması ciddi sorunlara neden olabilir.

Sözdizimi

alias method-name method-name
alias global-variable-name global-variable-name

Misal

alias foo bar
alias $MATCH $&

Burada bar için foo takma adı tanımladık ve $ MATCH, $ & için bir takma addır.

Ruby undef İfadesi

Bu, yöntem tanımını iptal eder. Yöntem gövdesinde bir undef görünemez.

Undef ve takma ad kullanılarak , sınıfın arabirimi üst sınıftan bağımsız olarak değiştirilebilir, ancak self'e yapılan dahili yöntem çağrısıyla programların bozuk olabileceğine dikkat edin.

Sözdizimi

undef method-name

Misal

Bar adlı bir yöntemi tanımsız hale getirmek için aşağıdakileri yapın -

undef bar

Ruby'nin çeşitli ifadeleri koyabileceğiniz yöntemleri nasıl tanımladığını gördünüz ve sonra bu yöntemi çağırıyorsunuz. Benzer şekilde, Ruby'nin de Blok kavramı vardır.

  • Bir blok kod parçalarından oluşur.

  • Bir bloğa bir isim atarsınız.

  • Bloktaki kod her zaman küme parantezi ({}) içine alınır.

  • Bir blok her zaman bloğunki ile aynı ada sahip bir fonksiyondan çağrılır. Bu , test adında bir bloğunuz varsa , bu bloğu çağırmak için fonksiyon testini kullanacağınız anlamına gelir .

  • Getiri ifadesini kullanarak bir blok çağırırsınız .

Sözdizimi

block_name {
   statement1
   statement2
   ..........
}

Burada, basit bir getiri ifadesi kullanarak bir bloğu çağırmayı öğreneceksiniz . Ayrıca , bir bloğu çağırmak için parametrelerle bir verim ifadesini kullanmayı da öğreneceksiniz . Örnek kodu her iki türden getiri ifadesi ile kontrol edeceksiniz .

Getiri Beyanı

Getiri ifadesinin bir örneğine bakalım -

#!/usr/bin/ruby

def test
   puts "You are in the method"
   yield
   puts "You are again back to the method"
   yield
end
test {puts "You are in the block"}

Bu, aşağıdaki sonucu verecektir -

You are in the method
You are in the block
You are again back to the method
You are in the block

Ayrıca, getiri ifadesiyle parametreleri de iletebilirsiniz. İşte bir örnek -

#!/usr/bin/ruby

def test
   yield 5
   puts "You are in the method test"
   yield 100
end
test {|i| puts "You are in the block #{i}"}

Bu, aşağıdaki sonucu verecektir -

You are in the block 5
You are in the method test
You are in the block 100

Burada, verim ifadesinin ardından parametreler yazılır. Hatta birden fazla parametreyi bile geçebilirsiniz. Blokta, parametreleri kabul etmek için iki dikey çizgi (||) arasına bir değişken yerleştirirsiniz. Bu nedenle, önceki kodda, verim 5 ifadesi 5 değerini bir parametre olarak test bloğuna geçirir.

Şimdi şu ifadeye bakın -

test {|i| puts "You are in the block #{i}"}

Burada i değişkeninde 5 değeri alınır . Şimdi, aşağıdaki puts ifadesine bakın -

puts "You are in the block #{i}"

Bu puts ifadesinin çıktısı -

You are in the block 5

Birden fazla parametreyi geçirmek istiyorsanız, verim ifadesi şu olur -

yield a, b

ve blok -

test {|a, b| statement}

Parametreler virgülle ayrılacaktır.

Bloklar ve Yöntemler

Bir bloğun ve bir yöntemin birbiriyle nasıl ilişkilendirilebileceğini gördünüz. Normalde, bloğunki ile aynı ada sahip bir yöntemden getiri ifadesini kullanarak bir bloğu çağırırsınız. Bu nedenle, yazarsın -

#!/usr/bin/ruby

def test
   yield
end
test{ puts "Hello world"}

Bu örnek, bir bloğu uygulamanın en basit yoludur. Test bloğunu verim ifadesini kullanarak çağırırsınız .

Ancak bir yöntemin son bağımsız değişkeninden önce & gelirse, bu yönteme bir blok geçirebilirsiniz ve bu blok son parametreye atanacaktır. Bağımsız değişken listesinde hem * hem de & varsa, & daha sonra gelmelidir.

#!/usr/bin/ruby

def test(&block)
   block.call
end
test { puts "Hello World!"}

Bu, aşağıdaki sonucu verecektir -

Hello World!

BEGIN ve END Blokları

Her Ruby kaynak dosyası, dosya yüklenirken (BEGIN blokları) ve programın yürütülmesi bittikten sonra (END blokları) çalıştırılacak kod bloklarını bildirebilir.

#!/usr/bin/ruby

BEGIN { 
   # BEGIN block code 
   puts "BEGIN code block"
} 

END { 
   # END block code 
   puts "END code block"
}
   # MAIN block code 
puts "MAIN code block"

Bir program birden çok BEGIN ve END bloğu içerebilir. BEGIN blokları karşılaştıkları sırayla yürütülür. END blokları ters sırada yürütülür. Çalıştırıldığında, yukarıdaki program aşağıdaki sonucu verir -

BEGIN code block
MAIN code block
END code block

Modüller, yöntemleri, sınıfları ve sabitleri bir arada gruplamanın bir yoludur. Modüller size iki büyük fayda sağlar.

  • Modüller bir ad alanı sağlar ve ad çatışmalarını önler.

  • Modüller, mixin tesisini uygular .

Modüller, yöntemleriniz ve sabitlerinizin başka yöntemler ve sabitler tarafından üzerine basılma endişesi duymadan oynayabileceği bir sanal alan olan bir ad alanını tanımlar.

Sözdizimi

module Identifier
   statement1
   statement2
   ...........
end

Modül sabitleri, ilk büyük harfle, sınıf sabitleri gibi adlandırılır. Yöntem tanımları da benzer görünür: Modül yöntemleri tıpkı sınıf yöntemleri gibi tanımlanır.

Sınıf yöntemlerinde olduğu gibi, bir modül yöntemini, modülün adı ve bir nokta ile isminin önüne geçerek çağırırsınız ve modül adı ve iki iki nokta üst üste kullanarak bir sabite başvurursunuz.

Misal

#!/usr/bin/ruby

# Module defined in trig.rb file

module Trig
   PI = 3.141592654
   def Trig.sin(x)
   # ..
   end
   def Trig.cos(x)
   # ..
   end
end

Aynı işlev adına ancak farklı işlevselliğe sahip bir modül daha tanımlayabiliriz -

#!/usr/bin/ruby

# Module defined in moral.rb file

module Moral
   VERY_BAD = 0
   BAD = 1
   def Moral.sin(badness)
   # ...
   end
end

Sınıf yöntemleri gibi, bir modülde bir yöntem tanımladığınızda, modül adını ve ardından bir nokta ve ardından yöntem adını belirtirsiniz.

Ruby, İfade gerektirir

Required ifadesi, C ve C ++ 'nın include deyimine ve Java'nın import deyimine benzer. Üçüncü bir program herhangi bir tanımlı modülü kullanmak isterse, modül dosyalarını Ruby need deyimini kullanarak kolayca yükleyebilir -

Sözdizimi

require filename

Burada vermek gerekmez .rb uzantısı bir dosya adı ile birlikte.

Misal

$LOAD_PATH << '.'

require 'trig.rb'
require 'moral'

y = Trig.sin(Trig::PI/4)
wrongdoing = Moral.sin(Moral::VERY_BAD)

Burada kullanıyoruz $LOAD_PATH << '.'Ruby'nin içerilen dosyaların mevcut dizinde aranması gerektiğini bilmesini sağlamak için. $ LOAD_PATH kullanmak istemiyorsanız,require_relative göreceli bir dizinden dosyaları dahil etmek için.

IMPORTANT- Burada her iki dosya da aynı işlev adını içerir. Bu nedenle, bu program çağırırken kod belirsizliğine neden olur, ancak modüller bu kod belirsizliğini önler ve modül adını kullanarak uygun işlevi çağırabiliriz.

Ruby include İfadesi

Bir modülü bir sınıfa yerleştirebilirsiniz. Bir modülü bir sınıfa gömmek için , sınıfta include ifadesini kullanırsınız -

Sözdizimi

include modulename

Bir modül ayrı bir dosyada tanımlanmışsa, modülü bir sınıfa yerleştirmeden önce bu dosyayı need ifadesini kullanarak dahil etmek gerekir .

Misal

Support.rb dosyasında yazılı aşağıdaki modülü düşünün .

module Week
   FIRST_DAY = "Sunday"
   def Week.weeks_in_month
      puts "You have four weeks in a month"
   end
   def Week.weeks_in_year
      puts "You have 52 weeks in a year"
   end
end

Şimdi, bu modülü aşağıdaki gibi bir sınıfa dahil edebilirsiniz -

#!/usr/bin/ruby
$LOAD_PATH << '.'
require "support"

class Decade
include Week
   no_of_yrs = 10
   def no_of_months
      puts Week::FIRST_DAY
      number = 10*12
      puts number
   end
end
d1 = Decade.new
puts Week::FIRST_DAY
Week.weeks_in_month
Week.weeks_in_year
d1.no_of_months

Bu, aşağıdaki sonucu verecektir -

Sunday
You have four weeks in a month
You have 52 weeks in a year
Sunday
120

Ruby'deki karışımlar

Bu bölüme geçmeden önce, Nesne Yönelimli Kavramlar bilgisine sahip olduğunuzu varsayıyoruz.

Bir sınıf, birden fazla üst sınıftan özellikleri devralabildiğinde, sınıfın birden çok miras göstermesi beklenir.

Ruby çoklu kalıtımı doğrudan desteklemez ancak Ruby Modüllerinin başka bir harika kullanımı vardır. Bir vuruşta, mixin adı verilen bir kolaylık sağlayarak, çoklu miras ihtiyacını hemen hemen ortadan kaldırırlar .

Mixins, sınıflara işlevsellik eklemenin harika bir şekilde kontrol edilmesini sağlar. Ancak, karışımdaki kod, onu kullanan sınıftaki kodla etkileşime girdiğinde gerçek güçleri ortaya çıkar.

Mixin'i anlamak için aşağıdaki örnek kodu inceleyelim -

module A
   def a1
   end
   def a2
   end
end
module B
   def b1
   end
   def b2
   end
end

class Sample
include A
include B
   def s1
   end
end

samp = Sample.new
samp.a1
samp.a2
samp.b1
samp.b2
samp.s1

Modül A, a1 ve a2 yöntemlerinden oluşur. Modül B, b1 ve b2 yöntemlerinden oluşur. Sample sınıfı hem A hem de B modüllerini içerir. Sample sınıfı a1, a2, b1 ve b2 olmak üzere dört yöntemin tamamına erişebilir. Bu nedenle, Sample sınıfının her iki modülden de miras aldığını görebilirsiniz. Bu nedenle, Sample sınıfının çoklu kalıtım veya bir karışım gösterdiğini söyleyebilirsiniz .

Ruby'deki bir String nesnesi, tipik olarak insan dilini temsil eden karakterleri temsil eden bir veya daha fazla baytın rastgele bir dizisini tutar ve işler.

En basit dize değişmezleri tek tırnaklar (kesme işareti karakteri) içine alınır. Tırnak işaretlerinin içindeki metin dizenin değeridir -

'This is a simple Ruby string literal'

Tek tırnaklı bir dize değişmezi arasına kesme işareti yerleştirmeniz gerekiyorsa, önüne ters eğik çizgi koyun, böylece Ruby yorumlayıcısı dizeyi sonlandırdığını düşünmez -

'Won\'t you read O\'Reilly\'s book?'

Ters eğik çizgi, başka bir ters eğik çizgiden kaçmak için de çalışır, böylece ikinci ters eğik çizgi bir çıkış karakteri olarak yorumlanmaz.

Ruby'nin dizelerle ilgili özellikleri aşağıdadır.

İfade Değiştirme

İfade ikamesi, # {ve} kullanarak herhangi bir Ruby ifadesinin değerini bir dizeye yerleştirmenin bir yoludur -

#!/usr/bin/ruby

x, y, z = 12, 36, 72
puts "The value of x is #{ x }."
puts "The sum of x and y is #{ x + y }."
puts "The average was #{ (x + y + z)/3 }."

Bu, aşağıdaki sonucu verecektir -

The value of x is 12.
The sum of x and y is 48.
The average was 40.

Genel Sınırlandırılmış Dizeler

Genel sınırlandırılmış dizelerle, bir çift eşleme içinde, keyfi sınırlayıcı karakterler, örneğin,!, (, {, <, Vb., Önünde yüzde karakteri (%) bulunan dizeler oluşturabilirsiniz. Q, q ve x'in özel anlamları vardır. . Genel sınırlandırılmış dizeler olabilir -

%{Ruby is fun.}  equivalent to "Ruby is fun."
%Q{ Ruby is fun. } equivalent to " Ruby is fun. "
%q[Ruby is fun.]  equivalent to a single-quoted string
%x!ls! equivalent to back tick command output `ls`

Kaçış Karakterleri

NOTE- Çift tırnaklı bir dizede, bir çıkış karakteri yorumlanır; tek tırnaklı bir dizede, bir çıkış karakteri korunur.

Ters eğik çizgi gösterimi Onaltılık karakter Açıklama
\ a 0x07 Zil veya uyarı
\ b 0x08 Geri tuşu
\ cx   Ctrl-x
\ Cx   Ctrl-x
\ e 0x1b Kaçış
\ f 0x0c Form besleme
\ M- \ Cx   Meta-Control-x
\ n 0x0a Yeni hat
\ nnn   Sekizli gösterim, burada n 0.7 aralığında
\ r 0x0d Satırbaşı
\ s 0x20 Uzay
\ t 0x09 Sekme
\ v 0x0b Dikey sekme
\ x   Karakter x
\ xnn   Onaltılık gösterim, burada n 0.9, af veya AF aralığındadır

Karakter kodlaması

Ruby için varsayılan karakter seti, karakterleri tek baytlarla temsil edilebilen ASCII'dir. UTF-8 veya başka bir modern karakter seti kullanırsanız, karakterler bir ila dört bayt arasında gösterilebilir.

Karakter setinizi programınızın başında $ KCODE kullanarak şu şekilde değiştirebilirsiniz -

$KCODE = 'u'
Sr.No. Kod ve Açıklama
1

a

ASCII (hiçbiri ile aynı). Bu varsayılandır.

2

e

EUC.

3

n

Yok (ASCII ile aynı).

4

u

UTF-8.

Dize Yerleşik Yöntemleri

Bir String yöntemini çağırmak için bir String nesnesine ihtiyacımız var. String nesnesinin bir örneğini oluşturmanın yolu aşağıdadır -

new [String.new(str = "")]

Bu, str'nin bir kopyasını içeren yeni bir dizge nesnesi döndürür . Şimdi, str nesnesini kullanarak , mevcut herhangi bir örnek yöntemini kullanabiliriz. Örneğin -

#!/usr/bin/ruby

myStr = String.new("THIS IS TEST")
foo = myStr.downcase

puts "#{foo}"

Bu, aşağıdaki sonucu verecektir -

this is test
Sr.No. Yöntemler ve Açıklama
1

str % arg

Bir biçim belirtimi kullanarak bir dizeyi biçimlendirir. Birden fazla ikame içeriyorsa, arg bir dizi olmalıdır. Biçim belirtimi hakkında bilgi için, "Kernel Module" altındaki sprintf'e bakın.

2

str * integer

Tamsayı çarpı str içeren yeni bir dize döndürür. Başka bir deyişle, str, tekrarlanan tam sayı imleridir.

3

str + other_str

Other_str ile str'yi bitiştirir.

4

str << obj

Bir nesneyi str'ye birleştirir. Nesne 0.255 aralığında bir Fixnum ise, bir karaktere dönüştürülür. Concat ile karşılaştırın.

5

str <=> other_str

Str'yi diğer_dize ile karşılaştırarak -1 (küçüktür), 0 (eşittir) veya 1 (büyüktür) sonucunu verir. Karşılaştırma büyük / küçük harfe duyarlıdır.

6

str == obj

Eşitlik için str ve obj'i test eder. Obj bir String değilse, false döndürür; str <=> obj 0 döndürürse doğru döndürür.

7

str =~ obj

Str'yi normal ifade deseniyle eşleştirir obj. Maçın başladığı konumu döndürür; aksi takdirde, false.

8

str.capitalize

Bir dizeyi büyük harf yapar.

9

str.capitalize!

Büyük harfle aynıdır, ancak yerinde değişiklikler yapılır.

10

str.casecmp

Dizelerin büyük / küçük harf duyarlı bir karşılaştırmasını yapar.

11

str.center

Bir dizeyi ortalar.

12

str.chomp

Kayıt ayırıcısını ($ /), genellikle \ n, dizenin sonundan kaldırır. Kayıt ayırıcısı yoksa, hiçbir şey yapmaz.

13

str.chomp!

Chomp ile aynıdır, ancak yerinde değişiklikler yapılır.

14

str.chop

Str'deki son karakteri kaldırır.

15

str.chop!

Chop ile aynıdır, ancak yerinde değişiklikler yapılır.

16

str.concat(other_str)

Other_str ile str'yi bitiştirir.

17

str.count(str, ...)

Bir veya daha fazla karakter kümesini sayar. Birden fazla karakter kümesi varsa, bu kümelerin kesişimini sayar

18

str.crypt(other_str)

Str'ye tek yönlü bir kriptografik hash uygular. Bağımsız değişken, iki karakter uzunluğunda olması gereken, her karakter az, AZ, 0.9, aralığındaki tuz dizesidir. veya /.

19

str.delete(other_str, ...)

Str'nin, argümanlarının kesişimindeki tüm karakterlerin silinmiş bir kopyasını döndürür.

20

str.delete!(other_str, ...)

Silme ile aynı, ancak yerinde değişiklikler yapılır.

21

str.downcase

Tümü büyük harflerin küçük harfle değiştirildiği str'nin bir kopyasını döndürür.

22

str.downcase!

Küçük kasa ile aynıdır, ancak yerinde değişiklikler yapılır.

23

str.dump

Tüm yazdırılmayan karakterlerin \ nnn gösterimi ile değiştirildiği ve tüm özel karakterlerin çıkış yaptığı bir str sürümü döndürür.

24

str.each(separator = $/) { |substr| block }

Str'yi kayıt ayırıcı olarak (varsayılan olarak $ /) kullanarak her bir alt dizeyi sağlanan bloğa geçirerek böler.

25

str.each_byte { |fixnum| block }

Her baytı str'den bloğa geçirir, her baytı baytın ondalık gösterimi olarak döndürür.

26

str.each_line(separator=$/) { |substr| block }

Str'yi kayıt ayırıcı olarak (varsayılan olarak $ /) kullanarak her bir alt dizeyi sağlanan bloğa geçirerek böler.

27

str.empty?

Str boşsa (sıfır uzunluğa sahipse) doğru döndürür.

28

str.eql?(other)

Aynı uzunluk ve içeriğe sahiplerse iki dizge eşittir.

29

str.gsub(pattern, replacement) [or]

str.gsub(pattern) { |match| block }

Tüm desen oluşumlarının yerine veya blok değeriyle değiştirilmiş str'nin bir kopyasını döndürür. Kalıp tipik olarak bir Regexp olacaktır; bu bir Dize ise, o zaman normal ifade meta karakterleri yorumlanmayacaktır (yani / \ d / bir rakamla eşleşecektir, ancak '\ d' bir ters eğik çizgiyi takip eden bir 'd' ile eşleşecektir)

30

str[fixnum] [or] str[fixnum,fixnum] [or] str[range] [or] str[regexp] [or] str[regexp, fixnum] [or] str[other_str]

References str, aşağıdaki bağımsız değişkenleri kullanarak: bir Fixnum, fixnum'da bir karakter kodu döndürür; iki Fixnum, bir uzaklıktan (ilk sabit değer) uzunluğa (ikinci sabit değer) başlayan bir alt dizeyi döndürür; aralık, aralıktaki bir alt dize döndürür; regexp eşleşen dizgenin bir kısmını döndürür; fixnum ile regexp, eşleşen verileri fixnum'da döndürür; other_str, other_str ile eşleşen alt dizeyi döndürür. Negatif bir Fixnum, -1 ile dizenin sonunda başlar.

31

str[fixnum] = fixnum [or] str[fixnum] = new_str [or] str[fixnum, fixnum] = new_str [or] str[range] = aString [or] str[regexp] = new_str [or] str[regexp, fixnum] = new_str [or] str[other_str] = new_str ]

Bir dizenin tamamını veya bir kısmını değiştirin (atayın). Dilimin eşanlamlısı !.

32

str.gsub!(pattern, replacement) [or] str.gsub!(pattern) { |match|block }

Yerinde Dize # gsub değiştirme, herhangi bir değiştirme yapılmadıysa str veya nil değerini döndürür.

33

str.hash

Dizenin uzunluğuna ve içeriğine bağlı olarak bir karma döndürür.

34

str.hex

Str'den önde gelen karakterleri onaltılık sayılar dizisi olarak ele alır (isteğe bağlı bir işaret ve isteğe bağlı bir 0x ile) ve karşılık gelen sayıyı döndürür. Hata durumunda sıfır döndürülür.

35

str.include? other_str [or] str.include? fixnum

Str verilen dizeyi veya karakteri içeriyorsa doğru döndürür.

36

str.index(substring [, offset]) [or]

str.index(fixnum [, offset]) [or]

str.index(regexp [, offset])

Str'de verilen alt dizenin, karakterin (fixnum) veya desenin (regexp) ilk oluşumunun dizinini döndürür. Bulunmazsa sıfır döndürür. İkinci parametre varsa, aramaya başlamak için dizedeki konumu belirtir.

37

str.insert(index, other_str)

Diğer_dize belirtilen dizindeki karakterden önce, dizeyi değiştirerek ekler. Negatif dizinler dizenin sonundan itibaren sayılır ve verilen karakterden sonra eklenir. Amaç, verilen dizinde başlaması için bir dize eklemektir.

38

str.inspect

Str'nin yazdırılabilir bir sürümünü, özel karakterlerin çıkışıyla döndürür.

39

str.intern [or] str.to_sym

Str'ye karşılık gelen Sembolü döndürür, daha önce yoksa sembolü oluşturur.

40

str.length

Str uzunluğunu döndürür. Boyutu karşılaştırın.

41

str.ljust(integer, padstr = ' ')

Tamsayı, str uzunluğundan büyükse, str sola yaslanmış ve padstr ile doldurulmuş yeni bir Uzunluk tamsayı String döndürür; aksi takdirde str döndürür.

42

str.lstrip

Baştaki boşluk kaldırılmış olarak str'nin bir kopyasını döndürür.

43

str.lstrip!

Baştaki boşluğu dizeden kaldırır, değişiklik yapılmadıysa sıfır döndürür.

44

str.match(pattern)

Deseni bir Regexp'e dönüştürür (zaten değilse), ardından str üzerinde eşleşme yöntemini çağırır.

45

str.oct

Str'nin önde gelen karakterlerini sekizlik rakamlardan oluşan bir dizi olarak ele alır (isteğe bağlı işaretli) ve karşılık gelen sayıyı döndürür. Dönüştürme başarısız olursa 0 döndürür.

46

str.replace(other_str)

Dizenin içeriğini ve bozukluğunu other_str'deki karşılık gelen değerlerle değiştirir.

47

str.reverse

Str'deki karakterleri ters sırada içeren yeni bir dize döndürür.

48

str.reverse!

Str'yi yerinde ters çevirir.

49

str.rindex(substring [, fixnum]) [or]

str.rindex(fixnum [, fixnum]) [or]

str.rindex(regexp [, fixnum])

Str'de verilen alt dizenin, karakterin (fixnum) veya kalıbın (regexp) son oluşumunun dizinini döndürür. Bulunmazsa sıfır döndürür. İkinci parametre mevcutsa, arama sonlandırmak için dizedeki konumu belirtir. Bu noktanın ötesinde karakterler dikkate alınmayacaktır.

50.

str.rjust(integer, padstr = ' ')

Tamsayı, str uzunluğundan büyükse, str sağa yaslanmış ve padstr ile doldurulmuş uzunlukta yeni bir String tamsayı döndürür; aksi takdirde str döndürür.

51

str.rstrip

Sondaki boşluk kaldırılmış str'nin bir kopyasını döndürür.

52

str.rstrip!

Sondaki beyaz boşluğu str'den kaldırır, değişiklik yapılmadıysa sıfır döndürür.

53

str.scan(pattern) [or]

str.scan(pattern) { |match, ...| block }

Her iki form da (bir Regexp veya bir String olabilir) desenle eşleşerek str boyunca yinelenir. Her eşleşme için bir sonuç oluşturulur ve sonuç dizisine eklenir veya bloğa iletilir. Kalıp grup içermiyorsa, her bir sonuç eşleşen dizeden ($ &) oluşur. Kalıp gruplar içeriyorsa, her bir sonucun kendisi grup başına bir girdi içeren bir dizidir.

54

str.slice(fixnum) [or] str.slice(fixnum, fixnum) [or]

str.slice(range) [or] str.slice(regexp) [or]

str.slice(regexp, fixnum) [or] str.slice(other_str)

See str[fixnum], etc.

str.slice!(fixnum) [or] str.slice!(fixnum, fixnum) [or]

str.slice!(range) [or] str.slice!(regexp) [or]

str.slice!(other_str)

Belirtilen kısmı str'den siler ve silinen kısmı döndürür. Bir Fixnum alan formlar, değer aralık dışındaysa bir IndexError yükseltir; Aralık formu bir RangeError oluşturur ve Regexp ve String formları atamayı sessizce yoksayar.

55

str.split(pattern = $, [limit])

Dizeyi bir sınırlayıcıya göre alt dizelere böler ve bu alt dizelerin bir dizisini döndürür.

Eğer model , bir String, daha sonra içeriğinin sınırlayıcı bölme str olarak kullanılır. Desen tek bir boşluksa, str boşlukta bölünür, baştaki beyaz boşluklar ve bitişik boşluk karakterleri yoksayılır.

Eğer desen bir Normal İfade olduğunu str nerede desen eşleşmeleri bölünür. Desen sıfır uzunluklu bir dizeyle eşleştiğinde, str ayrı karakterlere bölünür.

Eğer model atlanırsa, değeri$; is used. If $; nil (öntanımlıdır), str boşlukta `` belirtilmiş gibi bölünür.

Eğer sınır parametresi atlanırsa, arka boş alanları bastırılmaktadır. Sınır pozitif bir sayı ise, en fazla bu alan sayısı döndürülür (sınır 1 ise, dizinin tamamı bir dizideki tek girdi olarak döndürülür). Negatifse, döndürülen alanların sayısı için bir sınır yoktur ve sondaki boş alanlar bastırılmaz.

56

str.squeeze([other_str]*)

Dize # sayısı için açıklanan yordamı kullanarak other_str parametrelerinden bir dizi karakter oluşturur. Bu kümede meydana gelen aynı karakterin çalıştırmalarının tek bir karakterle değiştirildiği yeni bir dize döndürür. Herhangi bir bağımsız değişken belirtilmezse, aynı karakterlerin tüm dizileri tek bir karakterle değiştirilir.

57

str.squeeze!([other_str]*)

Str'yi yerinde sıkıştırır, herhangi bir değişiklik yapılmamışsa str veya nil döndürür.

58

str.strip

Baştaki ve sondaki boşluklar kaldırılmış olarak str'nin bir kopyasını döndürür.

59

str.strip!

Str'den baştaki ve sondaki beyaz boşluğu kaldırır. Str değiştirilmediyse sıfır döndürür.

60

str.sub(pattern, replacement) [or]

str.sub(pattern) { |match| block }

İlk örüntü oluşumunun blok değeri veya değişimle değiştirildiği str'nin bir kopyasını döndürür. Kalıp tipik olarak bir Regexp olacaktır; bir Dize ise, hiçbir normal ifade meta karakterleri yorumlanmaz.

61

str.sub!(pattern, replacement) [or]

str.sub!(pattern) { |match| block }

Yerine Dize # alt değiştirme, dizge döndürme veya değiştirme yapılmadıysa nil gerçekleştirir.

62

str.succ [or] str.next

Halefi str'ye döndürür.

63

str.succ! [or] str.next!

Dize # succ ile eşdeğerdir, ancak alıcıyı yerinde değiştirir.

64

str.sum(n = 16)

Str'deki karakterlerin temel bir n bitlik sağlama toplamını döndürür; burada n, isteğe bağlı Fixnum parametresidir ve varsayılan olarak 16'dır. Sonuç basitçe str modulo 2n - 1'deki her bir karakterin ikili değerinin toplamıdır. iyi sağlama toplamı.

65

str.swapcase

Büyük harfli alfabetik karakterlerin küçük harfe ve küçük harfli karakterlerin büyük harfe dönüştürüldüğü bir str kopyası döndürür.

66

str.swapcase!

String # swapcase'e eşdeğerdir, ancak alıcıyı yerinde değiştirir, hiçbir değişiklik yapılmamışsa str veya nil döndürür.

67

str.to_f

> Str'deki baştaki karakterlerin kayan nokta sayısı olarak yorumlanmasının sonucunu döndürür. Geçerli bir sayının sonunu geçen gereksiz karakterler göz ardı edilir. Str başlangıcında geçerli bir sayı yoksa 0.0 döndürülür. Bu yöntem asla bir istisna yaratmaz.

68

str.to_i(base = 10)

Str'deki baştaki karakterlerin tamsayı tabanı olarak yorumlanmasının sonucunu döndürür (2, 8, 10 veya 16 tabanı). Geçerli bir sayının sonunu geçen gereksiz karakterler göz ardı edilir. Str başlangıcında geçerli bir sayı yoksa 0 döndürülür. Bu yöntem asla bir istisna yaratmaz.

69

str.to_s [or] str.to_str

Alıcıyı döndürür.

70

str.tr(from_str, to_str)

Str'nin bir kopyasını, başlangıç_dize içindeki karakterlerin, to_str'deki karşılık gelen karakterlerle değiştirilmiş olarak döndürür. To_str, from_str'den daha kısaysa, son karakteri ile doldurulur. Her iki dizge de karakter aralıklarını belirtmek için c1.c2 gösterimini kullanabilir ve from_str, listelenenler dışındaki tüm karakterleri belirten bir ^ ile başlayabilir.

71

str.tr!(from_str, to_str)

String # tr ile aynı kuralları kullanarak str'yi yerinde çevirir. Hiçbir değişiklik yapılmamışsa str veya nil döndürür.

72

str.tr_s(from_str, to_str)

Dize # tr altında açıklandığı gibi dizenin bir kopyasını işler, ardından çeviriden etkilenen bölgelerdeki yinelenen karakterleri kaldırır.

73

str.tr_s!(from_str, to_str)

Yerinde str üzerinde dize # tr_s işlemeyi gerçekleştirir, herhangi bir değişiklik yapılmadıysa str veya nil döndürür.

74

str.unpack(format)

> Biçim dizesine göre str (ikili veriler içerebilir) kodunu çözer ve çıkarılan her değerden bir dizi döndürür. Biçim dizgesi, Tablo 18'de özetlenen bir dizi tek karakterli yönergeden oluşur. Her yönergeyi, bu yönergeyle kaç kez tekrarlanacağını belirten bir sayı izleyebilir. Yıldız işareti (*) kalan tüm öğeleri kullanacaktır. SSiIlL yönergelerinin her birinin ardından, temel alınan platformun yerel boyutunu belirtilen tür için kullanmak üzere bir alt çizgi (_) gelebilir; aksi takdirde, platformdan bağımsız tutarlı bir boyut kullanır. Biçim dizesinde boşluklar yok sayılır.

75

str.upcase

Tüm küçük harfler büyük harflerle değiştirilmiş str'nin bir kopyasını döndürür. İşlem yerel ayara duyarlı değildir. Yalnızca a'dan z'ye karakterler etkilenir.

76

str.upcase!

Str'nin içeriğini büyük harfe değiştirir, hiçbir değişiklik yapılmazsa sıfır döndürür.

77

str.upto(other_str) { |s| block }

Str'den başlayıp other_str inclusive ile biten ardışık değerleri yineler, her değeri sırayla bloğa iletir. String # succ yöntemi, her bir değeri oluşturmak için kullanılır.

String unpack Direktifleri

Direktif İadeler Açıklama
Bir Dize Sondaki boşluklar ve boşluklar kaldırılarak.
a Dize Dize.
B Dize Her karakterden bitleri çıkarır (en önemli bit önce).
b Dize Her karakterden bitleri çıkarır (en az anlamlı bit önce).
C Fixnum Bir karakteri işaretsiz tamsayı olarak ayıklar.
c Fixnum Bir karakteri tam sayı olarak çıkarır.
D, d Yüzer Sizeof (double) karakterleri yerel bir çift olarak değerlendirir.
E Yüzer Sizeof (double) karakterlerini littleendian bayt sırasına göre double olarak değerlendirir.
e Yüzer Sizeof (float) karakterleri littleendian bayt sırasına göre bir kayan nokta olarak ele alır.
F, f Yüzer Sizeof (float) karakterleri yerel bir kayan nokta olarak değerlendirir.
G Yüzer Sizeof (double) karakterleri ağ bayt sırasına göre ikili olarak ele alır.
g Dize Sizeof (float) karakterleri ağ bayt sırasına göre kayan nokta olarak değerlendirir.
H Dize Her karakterden onaltılık yarımları çıkarır (en önemli bit önce)
h Dize Her karakterden onaltılık yarımları çıkarır (en az anlamlı bit önce).
ben Tamsayı Sizeof (int) (_ ile değiştirilmiş) ardışık karakterleri işaretsiz yerel tamsayı olarak değerlendirir.
ben Tamsayı Sizeof (int) (_ ile değiştirilmiş) ardışık karakterleri işaretli yerel tamsayı olarak değerlendirir.
L Tamsayı Dört (_ ile değiştirilmiş) ardışık karakteri işaretsiz yerel uzun tam sayı olarak ele alır.
l Tamsayı Dört (_ ile değiştirilmiş) ardışık karakteri imzalı yerel uzun tamsayı olarak ele alır.
M Dize Alıntılı yazdırılabilir.
m Dize Base64 ile kodlanmış.
N Tamsayı Dört karakteri, ağ bayt sırasına göre işaretsiz uzun olarak değerlendirir.
n Fixnum İki karakteri ağ bayt sırasına göre işaretsiz bir kısa olarak ele alır.
P Dize Sizeof (char *) karakterlerini bir işaretçi olarak ele alır ve referans alınan konumdan \ emp {len} karakterlerini döndürür.
p Dize Sizeof (char *) karakterlerini boş sonlandırılmış bir dizeye işaretçi olarak değerlendirir.
Q Tamsayı Sekiz karaktere işaretsiz dörtlü sözcük (64 bit) muamelesi yapar.
q Tamsayı Sekiz karakteri işaretli dörtlü sözcük (64 bit) olarak ele alır.
S Fixnum İki (_ kullanılmışsa farklı) ardışık karakteri yerel bayt sırasına göre işaretsiz bir kısa olarak ele alır.
s Fixnum İki (_ kullanılmışsa farklı) ardışık karakteri yerel bayt sırasına göre imzalanmış kısa bir karakter olarak ele alır.
U Tamsayı İşaretsiz tamsayılar olarak UTF-8 karakterleri.
sen Dize UU kodlu.
V Fixnum Küçük endian bayt sırasına göre dört karaktere işaretsiz long olarak davranır.
v Fixnum İki karakteri küçük endian bayt sırasına göre işaretsiz kısa olarak ele alır.
w Tamsayı BER ile sıkıştırılmış tamsayı.
X   Bir karakter geri atlar.
x   Bir karakter ileri atlar.
Z Dize Sondaki boş değerler * ile ilk boş değere kadar kaldırılır.
@   Uzunluk bağımsız değişkeni tarafından verilen uzaklığa atlar.

Misal

Çeşitli verileri açmak için aşağıdaki örneği deneyin.

"abc \0\0abc \0\0".unpack('A6Z6')   #=> ["abc", "abc "]
"abc \0\0".unpack('a3a3')           #=> ["abc", " \000\000"]
"abc \0abc \0".unpack('Z*Z*')       #=> ["abc ", "abc "]
"aa".unpack('b8B8')                 #=> ["10000110", "01100001"]
"aaa".unpack('h2H2c')               #=> ["16", "61", 97]
"\xfe\xff\xfe\xff".unpack('sS')     #=> [-2, 65534]
"now = 20is".unpack('M*')           #=> ["now is"]
"whole".unpack('xax2aX2aX1aX2a')    #=> ["h", "e", "l", "l", "o"]

Ruby dizileri, herhangi bir nesnenin sıralı, tamsayı dizinli koleksiyonlarıdır. Bir dizideki her eleman bir indeksle ilişkilendirilir ve bir indeks tarafından anılır.

Dizi indeksleme, C veya Java'da olduğu gibi 0'dan başlar. Dizinin sonuna göre negatif bir indeks varsayılır - yani -1 indisi dizinin son öğesini belirtir, -2 dizideki sondan sonraki öğedir ve bu böyle devam eder.

Ruby dizileri String, Integer, Fixnum, Hash, Symbol gibi nesneleri ve hatta diğer Array nesnelerini tutabilir. Ruby dizileri, diğer dillerdeki diziler kadar katı değildir. Ruby dizileri, onlara eleman eklerken otomatik olarak büyür.

Diziler Oluşturma

Bir dizi yaratmanın veya başlatmanın birçok yolu vardır. Bunun bir yolu, yeni sınıf yöntemidir -

names = Array.new

Dizi yaratma anında bir dizinin boyutunu ayarlayabilirsiniz -

names = Array.new(20)

Dizi adlarının boyutu veya uzunluğu artık 20 öğedir. Bir dizinin boyutunu boyut veya uzunluk yöntemleriyle döndürebilirsiniz -

#!/usr/bin/ruby

names = Array.new(20)
puts names.size  # This returns 20
puts names.length # This also returns 20

Bu, aşağıdaki sonucu verecektir -

20
20

Dizideki her öğeye aşağıdaki gibi bir değer atayabilirsiniz -

#!/usr/bin/ruby

names = Array.new(4, "mac")
puts "#{names}"

Bu, aşağıdaki sonucu verecektir -

["mac", "mac", "mac", "mac"]

Ayrıca, her bir öğeyi bloğun değerlendirdiği şeyle dolduran yeni bir blok da kullanabilirsiniz -

#!/usr/bin/ruby

nums = Array.new(10) { |e| e = e * 2 }
puts "#{nums}"

Bu, aşağıdaki sonucu verecektir -

[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

[] Adlı başka bir Array yöntemi daha var. Bu şekilde çalışır -

nums = Array.[](1, 2, 3, 4,5)

Aşağıdaki gibi bir dizi oluşturma şekli daha -

nums = Array[1, 2, 3, 4,5]

Çekirdek çekirdek Ruby uygun modülü yalnızca tek bir bağımsız değişken kabul eden bir dizi yöntemi vardır. Burada yöntem, bir rakam dizisi oluşturmak için argüman olarak bir aralık alır -

#!/usr/bin/ruby

digits = Array(0..9)
puts "#{digits}"

Bu, aşağıdaki sonucu verecektir -

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Dizi Yerleşik Yöntemleri

Bir Array yöntemini çağırmak için Array nesnesinin bir örneğine ihtiyacımız var. Gördüğümüz gibi, Array nesnesinin bir örneğini yaratmanın yolu aşağıdadır -

Array.[](...) [or] Array[...] [or] [...]

Bu, verilen nesnelerle doldurulmuş yeni bir dizi döndürecektir. Şimdi, oluşturulan nesneyi kullanarak, mevcut herhangi bir örnek yöntemini çağırabiliriz. Örneğin -

#!/usr/bin/ruby

digits = Array(0..9)
num = digits.at(6)
puts "#{num}"

Bu, aşağıdaki sonucu verecektir -

6
Sr.No. Yöntemler ve Açıklama
1

array & other_array

Yinelenmeyen, iki dizide ortak olan öğeleri içeren yeni bir dizi döndürür.

2

array * int [or] array * str

Self'in int kopyalarını birleştirerek oluşturulmuş yeni bir dizi döndürür. Self.join (str) ile eşdeğer bir String bağımsız değişkeniyle.

3

array + other_array

Üçüncü bir dizi oluşturmak için iki diziyi birleştirerek oluşturulmuş yeni bir dizi döndürür.

4

array - other_array

Diğer_dizide de görünen tüm öğeleri kaldırarak, orijinal dizinin bir kopyası olan yeni bir dizi döndürür.

5

array <=> other_array

Str'yi diğer_dize ile karşılaştırarak -1 (küçüktür), 0 (eşittir) veya 1 (büyüktür) sonucunu verir. Karşılaştırma büyük / küçük harf duyarlıdır.

6

array | other_array

Diğer_diziler ile diziyi birleştirip kopyaları kaldırarak yeni bir dizi döndürür.

7

array << obj

Verilen nesneyi dizinin sonuna iter. Bu ifade dizinin kendisini döndürür, bu nedenle birkaç uzantı birbirine zincirlenmiş olabilir.

8

array <=> other_array

Bu dizi diğer_diziden küçükse, ona eşitse veya ondan büyükse bir tamsayı (-1, 0 veya +1) döndürür.

9

array == other_array

Aynı sayıda öğe içeriyorlarsa ve her öğe diğer dizideki karşılık gelen öğeye eşitse (Object. =='ye göre) iki dizi eşittir.

10

array[index] [or] array[start, length] [or]

array[range] [or] array.slice(index) [or]

array.slice(start, length) [or] array.slice(range)

En İade elemanı indeksi veya döner bir altdizilim başlayan başlangıcı ve devam eden uzunluk elemanları veya belirlediği bir SubArray döndüren aralığında . Negatif indisler, dizinin sonundan geriye doğru sayılır (-1, son öğedir). Dizin (veya başlangıç ​​dizini) aralık dışındaysa sıfır döndürür .

11

array[index] = obj [or]

array[start, length] = obj or an_array or nil [or]

array[range] = obj or an_array or nil

En Setleri elemanı indeksi veya cümledeki bir altdizilim başlayan başlangıcı ve devam eden uzunluk elemanları veya belirlediği bir SubArray değiştirir aralığında . Dizinler dizinin mevcut kapasitesinden büyükse, dizi otomatik olarak büyür. Negatif endeksler, dizinin sonundan geriye doğru sayılır. Uzunluk sıfırsa eleman ekler . Eğer sıfır , ikinci ve üçüncü şeklinde kullanılır, elemanları siler öz .

12

array.abbrev(pattern = nil)

Kendindeki dizeler için belirsiz olmayan kısaltmalar kümesini hesaplar . Bir desen veya dizge geçirilirse, yalnızca kalıpla eşleşen veya dizeyle başlayan dizeler dikkate alınır.

13

array.assoc(obj)

Nesneleri aynı zamanda diziler olan bir dizide arar ve obj. Eşleşme bulunmazsa eşleşen veya nil olan ilk içerilen diziyi döndürür .

14

array.at(index)

Dizindeki öğeyi döndürür. Negatif bir indeks kendiliğin sonundan itibaren sayılır. Dizin aralık dışındaysa sıfır döndürür.

15

array.clear

Diziden tüm öğeleri kaldırır.

16

array.collect { |item| block } [or]

array.map { |item| block }

Benliğin her bir öğesi için bir kez blok çağırır . Blok tarafından döndürülen değerleri içeren yeni bir dizi oluşturur.

17

array.collect! { |item| block } [or]

array.map! { |item| block }

Kendinin her bir öğesi için bloğu bir kez çağırır , öğeyi blok tarafından döndürülen değerle değiştirir .

18

array.compact

İade bir kopyasını kendini tüm nil elemanları kaldırıldı.

19

array.compact!

Diziden nil öğeleri kaldırır . Hiçbir değişiklik yapılmadıysa sıfır döndürür .

20

array.concat(other_array)

İçin other_array öğeleri ekler kendini .

21

array.delete(obj) [or]

array.delete(obj) { block }

Den siler öğe kendine eşittir obj . Öğe bulunmazsa, sıfır döndürür . İsteğe bağlı kod bloğu verilirse, öğe bulunamazsa bloğun sonucunu döndürür .

22

array.delete_at(index)

Belirtilen dizindeki öğeyi siler, bu öğeyi döndürür veya dizin aralık dışındaysa sıfırdır .

23

array.delete_if { |item| block }

Her eleman siler kendini hangi blok değerlendirir true.

24

array.each { |item| block }

Aramalar bloke her eleman için bir kere kendini bir parametre olarak o öğeyi geçen.

25

array.each_index { |index| block }

Her biri Array # ile aynıdır, ancak öğenin kendisi yerine öğenin dizinini iletir.

26

array.empty?

Self dizisi hiç öğe içermiyorsa doğru döndürür.

27

array.eql?(other)

Dizi ve diğerleri aynı nesneyse veya her ikisi de aynı içeriğe sahip dizilerse doğru döndürür .

28

array.fetch(index) [or]

array.fetch(index, default) [or]

array.fetch(index) { |index| block }

Öğeyi konum dizininde döndürmeye çalışır . Eğer göstergesi dizisi dışında bulunan birinci formu bir atar IndexError durum, ikinci kalıp döner varsayılan ve üçüncü bir şekilde döner çağırarak değeri blok geçen, dizin . Dizinin sonundan itibaren dizin sayımının negatif değerleri .

29

array.fill(obj) [or]

array.fill(obj, start [, length]) [or]

array.fill(obj, range) [or]

array.fill { |index| block } [or]

array.fill(start [, length] ) { |index| block } [or]

array.fill(range) { |index| block }

İlk üç formları seçilen unsurları ayarlamak kendini için obj . Sıfır değerinin başlangıcı, sıfıra eşittir. Bir uzunluğu sıfıra denktir self.length . Son üç form , diziyi bloğun değeriyle doldurur . Blok her elemanın mutlak göstergesi doldurulacak ile geçirilir.

30

array.first [or]

array.first(n)

Dizinin ilk öğesini veya ilk n öğesini döndürür . Dizi boşsa, birinci form nil döndürür ve ikinci form boş bir dizi döndürür.

31

array.flatten

Bu dizinin tek boyutlu düzleştirilmesi olan (özyinelemeli olarak) yeni bir dizi döndürür.

32

array.flatten!

Düzleştirir dizisi yerinde. Hiçbir değişiklik yapılmamışsa sıfır döndürür . (dizi alt dizi içermez.)

33

array.frozen?

Dizi dondurulmuşsa (veya sıralanırken geçici olarak dondurulmuşsa) doğru döndürür .

34

array.hash

Dizi için bir karma kod hesaplar. Aynı içeriğe sahip iki dizi aynı hash koduna sahip olacaktır.

35

array.include?(obj)

Obj kendi içinde mevcutsa true , aksi takdirde false döndürür.

36

array.index(obj)

Self içindeki ilk nesnenin == obj olan indeksini döndürür . Eşleşme bulunmazsa sıfır döndürür .

37

array.indexes(i1, i2, ... iN) [or]

array.indices(i1, i2, ... iN)

Bu yöntemler Ruby'nin en son sürümünde kullanımdan kaldırılmıştır, bu nedenle lütfen Array # values_at kullanın.

38

array.indices(i1, i2, ... iN) [or]

array.indexes(i1, i2, ... iN)

Bu yöntemler Ruby'nin en son sürümünde kullanımdan kaldırılmıştır, bu nedenle lütfen Array # values_at kullanın.

39

array.insert(index, obj...)

Verilen dizine sahip öğenin önüne verilen değerleri ekler (negatif olabilir).

40

array.inspect

Dizinin yazdırılabilir bir sürümünü oluşturur.

41

array.join(sep = $,)

Dizinin her öğesini sep ile ayrılmış bir dizeye dönüştürerek oluşturulan bir dize döndürür .

42

array.last [or] array.last(n)

Kendinin son elemanlarını verir . Dizi boşsa , ilk form nil değerini döndürür .

43

array.length

Kendi içindeki öğelerin sayısını verir . Sıfır olabilir.

44

array.map { |item| block } [or]

array.collect { |item| block }

Benliğin her bir öğesi için bir kez blok çağırır . Blok tarafından döndürülen değerleri içeren yeni bir dizi oluşturur .

45

array.map! { |item| block } [or]

array.collect! { |item| block }

Dizinin her öğesi için bloğu bir kez çağırır , öğeyi blok tarafından döndürülen değerle değiştirir.

46

array.nitems

Kendi içindeki sıfır olmayan öğelerin sayısını döndürür . Sıfır olabilir.

47

array.pack(aTemplateString)

Dizinin içeriğini bir TemplateString'deki yönergelere göre ikili bir sıraya paketler. A, a ve Z direktiflerinin ardından, ortaya çıkan alanın genişliğini veren bir sayı gelebilir. Kalan yönergeler de dönüştürülecek dizi öğelerinin sayısını gösteren bir sayım alabilir. Sayı bir yıldız işaretiyse (*), kalan tüm dizi öğeleri dönüştürülür. Belirtilen tür için temel platformun yerel boyutunu kullanmak için yönergelerden herhangi birinin ardından bir alt çizgi (_) gelebilir; aksi takdirde, platformdan bağımsız bir boyut kullanırlar. Şablon dizesinde boşluklar yok sayılır.

48

array.pop

Son öğesini kaldırır dizisi ve getiri o ya da sıfır ise dizi boştur.

49

array.push(obj, ...)

Verilen nesneyi bu dizinin sonuna iter (ekler). Bu ifade dizinin kendisini döndürür, bu nedenle birkaç uzantı birbirine zincirlenmiş olabilir.

50

array.rassoc(key)

Elemanları aynı zamanda dizi olan dizi içinde arama yapar. Karşılaştırır anahtar == kullanarak her bir alan dizinin ikinci elemanı. Eşleşen ilk içerilen diziyi döndürür.

51

array.reject { |item| block }

Öğe içeren yeni bir dizi döndürür dizi blok olmadığı için geçerlidir .

52

array.reject! { |item| block }

Bloğun kendisi için doğru olarak değerlendirildiği diziden öğeleri siler , ancak hiçbir değişiklik yapılmadıysa sıfır döndürür . Array # delete_if ile eşdeğerdir.

53

array.replace(other_array)

İçeriğini değiştirir dizinin içeriğiyle other_array kısaltılıyor veya gerekirse genişleyen.

54

array.reverse

Dizinin öğelerini ters sırada içeren yeni bir dizi döndürür.

55

array.reverse!

Diziyi yerinde ters çevirir .

56

array.reverse_each {|item| block }

Her biri Array # ile aynıdır, ancak diziyi ters sırada dolaşır.

57

array.rindex(obj)

Dizi == içindeki son nesnenin dizinini obj öğesine döndürür. Eşleşme bulunmazsa sıfır döndürür .

58

array.select {|item| block }

Diziden ardışık öğelerden geçen bloğu çağırır ve bloğun gerçek bir değer döndürdüğü öğeleri içeren bir dizi döndürür .

59

array.shift

Benliğin ilk öğesini döndürür ve onu kaldırır (diğer tüm öğeleri birer birer aşağı kaydırır). Dizi boşsa nil döndürür .

60

array.size

Dizinin uzunluğunu (öğe sayısı) döndürür . Uzunluk için takma ad.

61

array.slice(index) [or] array.slice(start, length) [or]

array.slice(range) [or] array[index] [or]

array[start, length] [or] array[range]

En İade elemanı indeksi veya döner bir altdizilim başlayan başlangıcı ve devam eden uzunluk elemanları veya belirlediği bir SubArray döndüren aralığında . Negatif indisler, dizinin sonundan geriye doğru sayılır (-1, son öğedir). İade nil eğer endeks (veya başlangıç indeks) aralığın dışında.

62

array.slice!(index) [or] array.slice!(start, length) [or]

array.slice!(range)

Bir dizin (isteğe bağlı olarak bir uzunluk ile) veya bir aralık tarafından verilen öğeleri siler . İade silinen nesne, altdizilim veya nil eğer endeks aralık dışında.

63

array.sort [or] array.sort { | a,b | block }

Self sıralamasıyla oluşturulan yeni bir dizi döndürür.

64

array.sort! [or] array.sort! { | a,b | block }

Kendini sıralar.

65

array.to_a

Kendini döndürür . Array alt sınıfında çağrılırsa , alıcıyı bir Array nesnesine dönüştürür.

66

array.to_ary

Kendini döndürür.

67

array.to_s

Self.join döndürür.

68

array.transpose

Self'in bir dizi dizisi olduğunu ve satırların ve sütunların yerini değiştirdiğini varsayar.

69

array.uniq

Yinelenen değerleri atarak yeni dizi döndürür dizisi .

70

array.uniq!

Yinelenen öğeleri kendinden kaldırır . Hiçbir değişiklik yapılmazsa (yani kopya bulunmazsa) sıfır döndürür .

71

array.unshift(obj, ...)

Nesneleri dizinin önüne, diğer öğeleri bir yukarıya ekler.

72

array.values_at(selector,...)

Verilen seçiciye (bir veya daha fazla) karşılık gelen kendi içindeki öğeleri içeren bir dizi döndürür . Seçiciler, tamsayı endeksleri veya aralıklar olabilir.

73

array.zip(arg, ...) [or]

array.zip(arg, ...){ | arr | block }

Herhangi bir argümanı dizilere dönüştürür, ardından dizi öğelerini her argümandan karşılık gelen öğelerle birleştirir .

Dizi paketi yönergeleri

Sr.No. Yönerge ve Açıklama
1

@

Mutlak konuma geçer.

2

A

ASCII dizesi (boşluk doldurulmuş, sayı genişliktir).

3

a

ASCII dizesi (boş doldurulmuş, sayı genişliktir).

4

B

string (azalan bit sırası).

5

b

Bit dizesi (artan bit sırası).

6

C

İmzasız karakter.

7

c

Char.

8

D, d

Çift hassasiyetli kayan nokta, yerel format.

9

E

Çift duyarlıklı kayan nokta, küçük endian bayt sırası.

10

e

Tek duyarlıklı kayan nokta, küçük endian bayt sırası.

11

F, f

Tek duyarlıklı kayan nokta, yerel biçim.

12

G

Çift duyarlıklı kayan nokta, ağ (büyük endian) bayt sırası.

13

g

Tek duyarlıklı kayan nokta, ağ (büyük endian) bayt sırası.

14

H

Hex string (önce yüksek yarım bayt).

15

h

Hex string (önce düşük yarım bayt).

16

I

İşaretsiz tam sayı.

17

i

Tamsayı.

18

L

İmzasız uzun.

19

l

Uzun.

20

M

Yazdırılabilir alıntı, MIME kodlaması (bkz. RFC 2045).

21

m

Base64 ile kodlanmış dize.

22

N

Uzun, ağ (big-endian) bayt sırası.

23

n

Kısa, ağ (büyük endian) bayt sırası.

24

P

Bir yapının işaretçisi (sabit uzunluklu dizge).

25

p

Boş sonlu bir dizeye işaretçi.

26

Q, q

64 bitlik sayı.

27

S

İmzasız kısa.

28

s

Kısa.

29

U

UTF-8.

30

u

UU kodlu dize.

31

V

Uzun, küçük endian bayt sırası.

32

v

Kısa, küçük endian bayt sırası.

33

w

BER ile sıkıştırılmış tamsayı \ fnm.

34

X

Bir bayt yedekleyin.

35

x

Boş bayt.

36

Z

Null değerinin * ile eklenmesi dışında a ile aynıdır.

Misal

Çeşitli verileri paketlemek için aşağıdaki örneği deneyin.

a = [ "a", "b", "c" ]
n = [ 65, 66, 67 ]
puts a.pack("A3A3A3")   #=> "a  b  c  "
puts a.pack("a3a3a3")   #=> "a\000\000b\000\000c\000\000"
puts n.pack("ccc")      #=> "ABC"

Bu, aşağıdaki sonucu verecektir -

a  b  c
abc
ABC

Hash, şuna benzer anahtar / değer çiftlerinin bir koleksiyonudur: "Employee" => "maaş". Dizin oluşturma işleminin bir tamsayı dizini ile değil, herhangi bir nesne türünün keyfi anahtarları aracılığıyla yapılması dışında, bir Dizi'ye benzer.

Bir hash'i anahtar veya değer ile geçirdiğiniz sıra rastgele görünebilir ve genellikle ekleme sırasında olmayacaktır. Var olmayan bir anahtarla bir karmaya erişmeye çalışırsanız, yöntem sıfır döndürür .

Hash Oluşturma

Dizilerde olduğu gibi, karmalar oluşturmanın çeşitli yolları vardır. Yeni sınıf yöntemiyle boş bir hash oluşturabilirsiniz -

months = Hash.new

Ayrıca kullanabilirsiniz yeni aksi takdirde sadece bir varsayılan değer ile bir karma oluşturmak için nil -

months = Hash.new( "month" )

or

months = Hash.new "month"

Varsayılan bir değeri olan bir karma içindeki herhangi bir anahtara eriştiğinizde, anahtar veya değer yoksa, karmaya erişmek varsayılan değeri döndürür -

#!/usr/bin/ruby

months = Hash.new( "month" )

puts "#{months[0]}"
puts "#{months[72]}"

Bu, aşağıdaki sonucu verecektir -

month
month

#!/usr/bin/ruby

H = Hash["a" => 100, "b" => 200]

puts "#{H['a']}"
puts "#{H['b']}"

Bu, aşağıdaki sonucu verecektir -

100
200

Herhangi bir Ruby nesnesini bir anahtar veya değer, hatta bir dizi olarak kullanabilirsiniz, bu nedenle aşağıdaki örnek geçerli bir örnektir -

[1,"jan"] => "January"

Hash Yerleşik Yöntemleri

Bir Hash yöntemini çağırmak için Hash nesnesinin bir örneğine ihtiyacımız var. Gördüğümüz gibi, Hash nesnesinin bir örneğini oluşturmanın yolu aşağıdadır -

Hash[[key =>|, value]* ] or

Hash.new [or] Hash.new(obj) [or]
Hash.new { |hash, key| block }

Bu, verilen nesnelerle doldurulmuş yeni bir hash döndürecektir. Şimdi oluşturulan nesneyi kullanarak, mevcut herhangi bir örnek yöntemini çağırabiliriz. Örneğin -

#!/usr/bin/ruby

$, = ", "
months = Hash.new( "month" )
months = {"1" => "January", "2" => "February"}

keys = months.keys
puts "#{keys}"

Bu, aşağıdaki sonucu verecektir -

["1", "2"]

Kamu karma yöntemleri aşağıda (varsayarak karma bir dizi amacı,) -

Sr.No. Yöntemler ve Açıklama
1

hash == other_hash

Aynı sayıda anahtar / değer çiftine sahip olup olmadıklarına ve anahtar / değer çiftlerinin her karmadaki karşılık gelen çiftle eşleşip eşleşmediğine bağlı olarak iki karmanın eşit olup olmadığını test eder.

2

hash.[key]

Bir anahtar kullanarak, hash'den bir değere başvurur. Anahtar bulunmazsa, varsayılan bir değer döndürür.

3

hash.[key] = value

Değer tarafından verilen değeri , anahtar tarafından verilen anahtarla ilişkilendirir .

4

hash.clear

Tüm anahtar / değer çiftlerini hash'den kaldırır.

5

hash.default(key = nil)

Varsayılan olarak ayarlanmamışsa, karma için varsayılan değeri , nil döndürür =. (Anahtar içinde mevcut değilse [], bir varsayılan değeri geri gönderir karma ).

6

hash.default = obj

Karma için varsayılan bir değer ayarlar .

7

hash.default_proc

Hash bir blok tarafından oluşturulmuşsa bir blok döndürür .

8

hash.delete(key) [or]

array.delete(key) { |key| block }

Bir anahtar-değer çifti siler karma göre anahtar . Blok kullanılıyorsa, çift bulunamazsa bir bloğun sonucunu döndürür. Delete_if ile karşılaştırın .

9

hash.delete_if { |key,value| block }

Bir anahtar-değer çifti siler karma her bir çift blok değerlendirir için geçerlidir .

10

hash.each { |key,value| block }

Karma üzerinde yineler , bloğu her anahtar için bir kez çağırır, anahtar / değer çiftini iki öğeli bir dizi olarak iletir.

11

hash.each_key { |key| block }

Karma üzerinde yineler , bloğu her anahtar için bir kez çağırır ve anahtarı parametre olarak iletir.

12

hash.each_key { |key_value_array| block }

Karma üzerinde yineler , bloğu her anahtar için bir kez çağırır , anahtarı ve değeri parametre olarak iletir.

13

hash.each_key { |value| block }

Yineler karma , her biri için bir kez blok çağrı anahtar , geçen değer , bir parametre olarak.

14

hash.empty?

Karmanın boş olup olmadığını (anahtar / değer çifti içermediğini) test eder, doğru veya yanlış döndürür .

15

hash.fetch(key [, default] ) [or]

hash.fetch(key) { | key | block }

Verilen anahtar için karma değerden bir değer döndürür . Eğer anahtar bulundu ve başka hiçbir argüman bulunmadığını edilemez, bir yükseltir IndexError istisna; eğer varsayılan verilir, bu döndürülür; isteğe bağlı blok belirtilirse, sonucu döndürülür.

16

hash.has_key?(key) [or] hash.include?(key) [or]

hash.key?(key) [or] hash.member?(key)

Verilen bir anahtarın karma olarak mevcut olup olmadığını test eder , doğru mu yanlışdöndürür .

17

hash.has_value?(value)

Hash'in verilen değeri içerip içermediğini test eder .

18

hash.index(value)

Eşleşen bir değer bulunmazsa , verilen değer için anahtarı karma, nil olarak döndürür .

19

hash.indexes(keys)

Verilen anahtarlar için değerlerden oluşan yeni bir dizi döndürür. Bulunamayan anahtarlar için varsayılan değeri ekler. Bu yöntem kullanımdan kaldırılmıştır. Seçimi kullanın.

20

hash.indices(keys)

Verilen anahtarlar için değerlerden oluşan yeni bir dizi döndürür. Bulunamayan anahtarlar için varsayılan değeri ekler. Bu yöntem kullanımdan kaldırılmıştır. Seçimi kullanın.

21

hash.inspect

Hash'in oldukça basılmış bir dize versiyonunu döndürür.

22

hash.invert

Yeni bir oluşturur karma tersini, anahtarlar ve değerler gelen karma ; olduğunu, yeni karma, gelen anahtarlar karma haline değerler ve değerler tuşları olurlar.

23

hash.keys

Dan tuşları ile yeni bir dizi oluşturur karma .

24

hash.length

Boyutunu veya uzunluğunu döndürür karma bir tam sayı olarak.

25

hash.merge(other_hash) [or]

hash.merge(other_hash) { |key, oldval, newval| block }

Hash ve other_hash içeriklerini içeren yeni bir hash döndürür , diger_hash'ten gelen anahtarlar ile hash içindeki çiftlerin üzerine yazılır .

26

hash.merge!(other_hash) [or]

hash.merge!(other_hash) { |key, oldval, newval| block }

Birleştirme ile aynıdır, ancak değişiklikler yerinde yapılır.

27

hash.rehash

Yeniden Yapıyor karma her biri için geçerli değerlere dayalı tuşu . Değerler eklendikten sonra değiştiyse, bu yöntem hash'i yeniden dizine ekler .

28

hash.reject { |key, value| block }

Bloğun doğru olarak değerlendirdiği her çift için yeni bir hash oluşturur

29

hash.reject! { |key, value| block }

Reddetmeyle aynı , ancak yerinde değişiklikler yapılır.

30

hash.replace(other_hash)

İçeriğini değiştirir karma içeriğiyle other_hash .

31

hash.select { |key, value| block }

İade anahtar değer çifti aşağıdakilerden oluşan yeni bir dizi karma olan blok döner doğru .

32

hash.shift

Bir anahtar-değer çifti kaldırır karma iki öğeli bir dizi olarak dönen.

33

hash.size

İade boyutu ya da uzunluğunu karma bir tam sayı olarak.

34

hash.sort

Dönüştürür karma anahtar değer çiftleri dizileri içeren bir iki boyutlu dizi, daha sonra bir dizi olarak sıralar.

35

hash.store(key, value)

Bir anahtar / değer çiftini karma biçiminde saklar .

36

hash.to_a

Hash'ten iki boyutlu bir dizi oluşturur. Her anahtar / değer çifti bir diziye dönüştürülür ve tüm bu diziler içeren bir dizide saklanır.

37

hash.to_hash

Hash (self) döndürür .

38

hash.to_s

Dönüştürür karma bir dizi, daha sonra bir dizeye bu diziyi dönüştürür.

39

hash.update(other_hash) [or]

hash.update(other_hash) {|key, oldval, newval| block}

İçeriğini içeren yeni karma döndürür karma ve other_hash de, üzerine yazılmasını çiftleri karma gelenler ile yinelenen anahtarlar ile other_hash .

40

hash.value?(value)

Test eder karma verilen içeren bir değer .

41

hash.values

Tüm hash değerlerini içeren yeni bir dizi döndürür .

42

hash.values_at(obj, ...)

Verilen anahtar veya anahtarlarla ilişkili karma değerlerinden değerleri içeren yeni bir dizi döndürür .

Timeclass, Ruby'deki tarihleri ​​ve saatleri temsil eder. İşletim sistemi tarafından sağlanan sistem tarih ve saat işlevselliği üzerinde ince bir katmandır. Bu sınıf, sisteminizde 1970'den önceki veya 2038'den sonraki tarihleri ​​temsil edemeyebilir.

Bu bölüm sizi en çok aranan tarih ve saat kavramlarına aşina hale getirir.

Güncel Tarih ve Saati Alma

Geçerli tarih ve saati almak için basit bir örnek aşağıdadır -

#!/usr/bin/ruby -w

time1 = Time.new
puts "Current Time : " + time1.inspect

# Time.now is a synonym:
time2 = Time.now
puts "Current Time : " + time2.inspect

Bu, aşağıdaki sonucu verecektir -

Current Time : Mon Jun 02 12:02:39 -0700 2008
Current Time : Mon Jun 02 12:02:39 -0700 2008

Tarih ve Saatin Bileşenlerini Alma

Tarih ve saatin çeşitli bileşenlerini elde etmek için Time nesnesini kullanabiliriz . Aynı şeyi gösteren örnek aşağıdadır -

#!/usr/bin/ruby -w

time = Time.new

# Components of a Time
puts "Current Time : " + time.inspect
puts time.year    # => Year of the date 
puts time.month   # => Month of the date (1 to 12)
puts time.day     # => Day of the date (1 to 31 )
puts time.wday    # => 0: Day of week: 0 is Sunday
puts time.yday    # => 365: Day of year
puts time.hour    # => 23: 24-hour clock
puts time.min     # => 59
puts time.sec     # => 59
puts time.usec    # => 999999: microseconds
puts time.zone    # => "UTC": timezone name

Bu, aşağıdaki sonucu verecektir -

Current Time : Mon Jun 02 12:03:08 -0700 2008
2008
6
2
1
154
12
3
8
247476
UTC

Time.utc, Time.gm ve Time.local İşlevleri

Bu iki işlev, tarihi aşağıdaki gibi standart bir biçimde biçimlendirmek için kullanılabilir -

# July 8, 2008
Time.local(2008, 7, 8)  
# July 8, 2008, 09:10am, local time
Time.local(2008, 7, 8, 9, 10)   
# July 8, 2008, 09:10 UTC
Time.utc(2008, 7, 8, 9, 10)  
# July 8, 2008, 09:10:11 GMT (same as UTC)
Time.gm(2008, 7, 8, 9, 10, 11)

Aşağıda, bir dizideki tüm bileşenleri aşağıdaki biçimde almak için örnek verilmiştir -

[sec,min,hour,day,month,year,wday,yday,isdst,zone]

Aşağıdakileri deneyin -

#!/usr/bin/ruby -w

time = Time.new
values = time.to_a
p values

Bu, aşağıdaki sonucu oluşturacaktır -

[26, 10, 12, 2, 6, 2008, 1, 154, false, "MST"]

Bu dizi , aşağıdaki gibi farklı tarih biçimleri elde etmek için Time.utc veya Time.local işlevlerine geçirilebilir -

#!/usr/bin/ruby -w

time = Time.new
values = time.to_a
puts Time.utc(*values)

Bu, aşağıdaki sonucu oluşturacaktır -

Mon Jun 02 12:15:36 UTC 2008

Aşağıda, (platforma bağlı) dönemden bu yana dahili olarak saniye olarak temsil edilen zamanı almanın yolu -

# Returns number of seconds since epoch
time = Time.now.to_i  

# Convert number of seconds into Time object.
Time.at(time)

# Returns second since epoch which includes microseconds
time = Time.now.to_f

Saat Dilimleri ve Yaz Saati Uygulaması

Saat dilimleri ve gün ışığından yararlanma ile ilgili tüm bilgileri aşağıdaki gibi almak için bir Saat nesnesi kullanabilirsiniz -

time = Time.new

# Here is the interpretation
time.zone       # => "UTC": return the timezone
time.utc_offset # => 0: UTC is 0 seconds offset from UTC
time.zone       # => "PST" (or whatever your timezone is)
time.isdst      # => false: If UTC does not have DST.
time.utc?       # => true: if t is in UTC time zone
time.localtime  # Convert to local timezone.
time.gmtime     # Convert back to UTC.
time.getlocal   # Return a new Time object in local zone
time.getutc     # Return a new Time object in UTC

Saatleri ve Tarihleri ​​Biçimlendirme

Tarih ve saati biçimlendirmenin çeşitli yolları vardır. İşte birkaçını gösteren bir örnek -

#!/usr/bin/ruby -w

time = Time.new
puts time.to_s
puts time.ctime
puts time.localtime
puts time.strftime("%Y-%m-%d %H:%M:%S")

Bu, aşağıdaki sonucu verecektir -

Mon Jun 02 12:35:19 -0700 2008
Mon Jun  2 12:35:19 2008
Mon Jun 02 12:35:19 -0700 2008
2008-06-02 12:35:19

Zaman Biçimlendirme Direktifleri

Aşağıdaki tablodaki bu yönergeler Time.strftime yöntemiyle kullanılır .

Sr.No. Yönerge ve Açıklama
1

%a

Kısaltılmış hafta içi adı (Paz).

2

%A

Tam gün adı (Pazar).

3

%b

Kısaltılmış ay adı (Jan).

4

%B

Tam ay adı (Ocak).

5

%c

Tercih edilen yerel tarih ve saat gösterimi.

6

%d

Ayın günü (01 - 31).

7

%H

Günün saati, 24 saatlik zaman biçimi (00-23).

8

%I

Günün saati, 12 saatlik zaman (01 - 12).

9

%j

Yılın günü (001 - 366).

10

%m

Yılın ayı (01 - 12).

11

%M

Saatin dakikası (00 ila 59).

12

%p

Meridyen göstergesi (AM veya PM).

13

%S

Dakikanın saniyesi (00 - 60).

14

%U

İlk haftanın ilk günü olarak ilk Pazar gününden başlayarak geçerli yılın hafta numarası (00 - 53).

15

%W

Mevcut yılın hafta numarası, ilk haftanın ilk günü olan ilk Pazartesi ile başlar (00 - 53).

16

%w

Haftanın günü (Pazar 0, 0 - 6).

17

%x

Yalnızca tarih için tercih edilen temsil, zaman yok.

18

%X

Yalnızca zaman için tercih edilen temsil, tarih yok.

19

%y

Yüzyılı olmayan yıl (00 - 99).

20

%Y

Yüzyıl.

21

%Z

Saat dilimi adı.

22

%%

Değişmez% karakteri.

Zaman Aritmetiği

Zamanla basit aritmetik işlemleri aşağıdaki gibi gerçekleştirebilirsiniz -

now = Time.now          # Current time
puts now

past = now - 10         # 10 seconds ago. Time - number => Time
puts past

future = now + 10  # 10 seconds from now Time + number => Time
puts future

diff = future - past     # => 10  Time - Time => number of seconds
puts diff

Bu, aşağıdaki sonucu verecektir -

Thu Aug 01 20:57:05 -0700 2013
Thu Aug 01 20:56:55 -0700 2013
Thu Aug 01 20:57:15 -0700 2013
20.0

Aralıklar her yerde görülür: Ocak - Aralık, 0 - 9, 50 - 67 arası satırlar vb. Ruby aralıkları destekler ve aralıkları çeşitli şekillerde kullanmamıza izin verir -

  • Diziler Olarak Aralıklar
  • Koşullar Olarak Aralıklar
  • Aralıklar Olarak Aralıklar

Diziler Olarak Aralıklar

Aralıkların ilk ve belki de en doğal kullanımı bir diziyi ifade etmektir. Dizilerin bir başlangıç ​​noktası, bir bitiş noktası ve dizide ardışık değerler üretme yolu vardır.

Ruby bu dizileri, ''..'' ve ''...''menzil operatörleri. İki noktalı form, kapsayıcı bir aralık oluştururken, üç noktalı form, belirtilen yüksek değeri hariç tutan bir aralık oluşturur.

(1..5)        #==> 1, 2, 3, 4, 5
(1...5)       #==> 1, 2, 3, 4
('a'..'d')    #==> 'a', 'b', 'c', 'd'

1..100 dizisi , iki Fixnum nesnesine referanslar içeren bir Range nesnesi olarak tutulur . Gerekirse, bir aralığı to_a yöntemini kullanarak listeye dönüştürebilirsiniz . Aşağıdaki örneği deneyin -

#!/usr/bin/ruby

$, =", "   # Array value separator
range1 = (1..10).to_a
range2 = ('bar'..'bat').to_a

puts "#{range1}"
puts "#{range2}"

Bu, aşağıdaki sonucu verecektir -

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
["bar", "bas", "bat"]

Aralıklar, üzerlerinde yineleme yapmanıza ve içeriklerini çeşitli şekillerde test etmenize olanak tanıyan yöntemler uygular -

#!/usr/bin/ruby

# Assume a range
digits = 0..9

puts digits.include?(5)
ret = digits.min
puts "Min value is #{ret}"

ret = digits.max
puts "Max value is #{ret}"

ret = digits.reject {|i| i < 5 }
puts "Rejected values are #{ret}"

digits.each do |digit|
   puts "In Loop #{digit}"
end

Bu, aşağıdaki sonucu verecektir -

true
Min value is 0
Max value is 9
Rejected values are 5, 6, 7, 8, 9
In Loop 0
In Loop 1
In Loop 2
In Loop 3
In Loop 4
In Loop 5
In Loop 6
In Loop 7
In Loop 8
In Loop 9

Koşullar Olarak Aralıklar

Aralıklar, koşullu ifadeler olarak da kullanılabilir. Örneğin, aşağıdaki kod parçası, standart girdiden satır kümelerini yazdırır; burada her kümedeki ilk satır, sözcüğün başlangıcını ve sözcüğün bittiği son satırı içerir -

while gets
   print if /start/../end/
end

Aralıklar, durum ifadelerinde kullanılabilir -

#!/usr/bin/ruby

score = 70

result = case score
   when 0..40 then "Fail"
   when 41..60 then "Pass"
   when 61..70 then "Pass with Merit"
   when 71..100 then "Pass with Distinction"
   else "Invalid Score"
end

puts result

Bu, aşağıdaki sonucu verecektir -

Pass with Merit

Aralıklar Olarak Aralıklar

Çok yönlü aralığın son bir kullanımı, aralık testidir: bazı değerlerin, aralık tarafından temsil edilen aralık dahilinde olup olmadığının görülmesi. Bu, durum eşitliği operatörü olan === kullanılarak yapılır.

#!/usr/bin/ruby

if ((1..10) === 5)
   puts "5 lies in (1..10)"
end

if (('a'..'j') === 'c')
   puts "c lies in ('a'..'j')"
end

if (('a'..'j') === 'z')
   puts "z lies in ('a'..'j')"
end

Bu, aşağıdaki sonucu verecektir -

5 lies in (1..10)
c lies in ('a'..'j')

Yineleyiciler, koleksiyonlar tarafından desteklenen yöntemlerden başka bir şey değildir . Bir grup veri üyesini depolayan nesnelere koleksiyon adı verilir. Ruby'de diziler ve karmalar koleksiyonlar olarak adlandırılabilir.

Yineleyiciler, bir koleksiyonun tüm öğelerini birbiri ardına döndürür. Burada, her biri ve toplanan iki yineleyiciyi tartışacağız . Bunlara detaylı bir şekilde bakalım.

Her Yineleyici Ruby

Her yineleyici, bir dizinin veya karmanın tüm öğelerini döndürür.

Sözdizimi

collection.each do |variable|
   code
end

Koleksiyondaki her öğe için kodu yürütür . Burada koleksiyon bir dizi veya yakut karması olabilir.

Misal

#!/usr/bin/ruby

ary = [1,2,3,4,5]
ary.each do |i|
   puts i
end

Bu, aşağıdaki sonucu verecektir -

1
2
3
4
5

Her yineleyiciyi her zaman bir blokla ilişkilendirirsiniz. Dizinin her değerini tek tek bloğa döndürür. Değer değişkende saklanıri ve sonra ekranda görüntülenir.

Ruby toplama Yineleyicisi

Toplamak yineleyici döndürür bir koleksiyonun tüm unsurları.

Sözdizimi

collection = collection.collect

Toplamak yöntem her zaman bloğu ile ilişkili olması gerekmez. Toplamak yöntem ne olursa olsun bir dizi ya da bir karma olmasına bakılmaksızın, tüm koleksiyonu döndürür.

Misal

#!/usr/bin/ruby

a = [1,2,3,4,5]
b = Array.new
b = a.collect
puts b

Bu, aşağıdaki sonucu verecektir -

1
2
3
4
5

NOTE- Collect yöntemi, diziler arasında kopyalama yapmanın doğru yolu değildir. Bir diziyi başka bir diziye kopyalamak için kullanılması gereken klon adı verilen başka bir yöntem vardır .

Yeni diziyi elde etmek için değerlerin her biriyle bir şeyler yapmak istediğinizde normalde toplama yöntemini kullanırsınız. Örneğin, bu kod, bir dizi üreten b 10 kez her değer içeren bir .

#!/usr/bin/ruby

a = [1,2,3,4,5]
b = a.collect{|x| 10*x}
puts b

Bu, aşağıdaki sonucu verecektir -

10
20
30
40
50

Ruby, Kernel modülünde uygulanan G / Ç ile ilgili bir dizi yöntem sağlar. Tüm G / Ç yöntemleri, sınıf IO'dan türetilmiştir.

Sınıf IO , okuma, yazma, alır, koyar, readline, getc ve printf gibi tüm temel yöntemleri sağlar .

Bu bölüm, Ruby'de bulunan tüm temel I / O işlevlerini kapsayacaktır. Daha fazla işlev için lütfen Ruby Class IO'ya bakın .

Puts İfadesi

Önceki bölümlerde, değişkenlere değerler atadınız ve ardından çıktıyı puts deyimini kullanarak yazdırdınız .

Koyar deyim değişken saklanan değeri görüntülemek için programı talimatını verir. Bu, yazdığı her satırın sonuna yeni bir satır ekleyecektir.

Misal

#!/usr/bin/ruby

val1 = "This is variable one"
val2 = "This is variable two"
puts val1
puts val2

Bu, aşağıdaki sonucu verecektir -

This is variable one
This is variable two

Gets İfadesi

Alır açıklamada STDIN adlandırılan standart ekrandan kullanıcıdan herhangi bir giriş almak için kullanılabilir.

Misal

Aşağıdaki kod, gets ifadesinin nasıl kullanılacağını gösterir. Bu kod, kullanıcıdan bir değer girmesini isteyecek ve bu değer bir değişken val'de saklanacak ve sonunda STDOUT'a yazdırılacaktır.

#!/usr/bin/ruby

puts "Enter a value :"
val = gets
puts val

Bu, aşağıdaki sonucu verecektir -

Enter a value :
This is entered value
This is entered value

Putc Bildirimi

Tüm dizgeyi ekrana çıkaran puts ifadesinin aksine, putc ifadesi her seferinde bir karakter çıktı vermek için kullanılabilir.

Misal

Aşağıdaki kodun çıktısı sadece H karakteridir -

#!/usr/bin/ruby

str = "Hello Ruby!"
putc str

Bu, aşağıdaki sonucu verecektir -

H

Baskı Beyanı

Baskı deyimi benzer koyar açıklamada. Tek fark, puts ifadesinin içeriği yazdırdıktan sonra bir sonraki satıra gitmesidir, oysa print ifadesi ile imleç aynı satıra yerleştirilir.

Misal

#!/usr/bin/ruby

print "Hello World"
print "Good Morning"

Bu, aşağıdaki sonucu verecektir -

Hello WorldGood Morning

Dosyaları Açma ve Kapatma

Şimdiye kadar, standart girdi ve çıktıyı okuyup yazıyordunuz. Şimdi, gerçek veri dosyalarıyla nasıl oynanacağını göreceğiz.

File.new Yöntemi

Mod dizesine göre okumak, yazmak veya her ikisi için File.new yöntemini kullanarak bir File nesnesi oluşturabilirsiniz . Son olarak, bu dosyayı kapatmak için File.close yöntemini kullanabilirsiniz .

Sözdizimi

aFile = File.new("filename", "mode")
   # ... process the file
aFile.close

File.open Yöntemi

Yeni bir dosya nesnesi oluşturmak ve bu dosya nesnesini bir dosyaya atamak için File.open yöntemini kullanabilirsiniz . Ancak, File.open ve File.new yöntemleri arasında bir fark vardır . Aradaki fark, File.open yönteminin bir blokla ilişkilendirilebilirken, File.new yöntemini kullanarak aynısını yapamazsınız .

File.open("filename", "mode") do |aFile|
   # ... process the file
end
Sr.No. Modlar ve Açıklama
1

r

Salt okunur mod. Dosya tanıtıcısı dosyanın başlangıcına yerleştirilir. Bu varsayılan moddur.

2

r+

Okuma-yazma modu. Dosya tanıtıcısı dosyanın başlangıcında olacaktır.

3

w

Yalnızca yazma modu. Dosya varsa dosyanın üzerine yazar. Dosya yoksa, yazmak için yeni bir dosya oluşturur.

4

w+

Okuma-yazma modu. Dosya varsa mevcut dosyanın üzerine yazar. Dosya yoksa, okumak ve yazmak için yeni bir dosya oluşturur.

5

a

Yalnızca yazma modu. Dosya varsa, dosya işaretçisi dosyanın sonundadır. Yani dosya ekleme modundadır. Dosya yoksa, yazmak için yeni bir dosya oluşturur.

6

a+

Okuma ve yazma modu. Dosya varsa, dosya işaretçisi dosyanın sonundadır. Dosya, ekleme modunda açılır. Dosya yoksa, okuma ve yazma için yeni bir dosya oluşturur.

Dosyaları Okuma ve Yazma

'Basit' G / Ç için kullandığımız yöntemlerin aynısı tüm dosya nesneleri için mevcuttur. Yani, standart girdiden bir satırı okur ve aFile.gets , aFile dosya nesnesinden bir satır okur.

Bununla birlikte, G / Ç nesneleri hayatımızı kolaylaştırmak için ek erişim yöntemleri kümesi sağlar.

Sysread Yöntemi

Bir dosyanın içeriğini okumak için sysread yöntemini kullanabilirsiniz . Sysread yöntemini kullanırken dosyayı herhangi bir modda açabilirsiniz. Örneğin -

Giriş metin dosyası aşağıdadır -

This is a simple text file for testing purpose.

Şimdi bu dosyayı okumaya çalışalım -

#!/usr/bin/ruby

aFile = File.new("input.txt", "r")
if aFile
   content = aFile.sysread(20)
   puts content
else
   puts "Unable to open file!"
end

Bu ifade, dosyanın ilk 20 karakterini çıkaracaktır. Dosya işaretçisi şimdi dosyadaki 21. karaktere yerleştirilecektir.

Syswrite Yöntemi

İçeriği bir dosyaya yazmak için syswrite yöntemini kullanabilirsiniz. Syswrite yöntemini kullanırken dosyayı yazma modunda açmanız gerekir. Örneğin -

#!/usr/bin/ruby

aFile = File.new("input.txt", "r+")
if aFile
   aFile.syswrite("ABCDEF")
else
   puts "Unable to open file!"
end

Bu ifade dosyaya "ABCDEF" yazacaktır.

Each_byte Yöntemi

Bu yöntem File sınıfına aittir . Each_byte yöntemi her zaman bir blokla ilişkilendirilir. Aşağıdaki kod örneğini düşünün -

#!/usr/bin/ruby

aFile = File.new("input.txt", "r+")
if aFile
   aFile.syswrite("ABCDEF")
   aFile.each_byte {|ch| putc ch; putc ?. }
else
   puts "Unable to open file!"
end

Karakterler ch değişkenine birer birer aktarılır ve ardından ekranda aşağıdaki gibi görüntülenir -

s. .a. .s.i.m.p.l.e. .t.e.x.t. .f.i.l.e. .f.o.r. .t.e.s.t.i.n.g. .p.u.r.p.o.s.e...
.
.

IO.readlines Yöntemi

Sınıf Dosya sınıfı IO bir alt sınıfıdır. Sınıf IO'nun ayrıca dosyaları işlemek için kullanılabilecek bazı yöntemleri vardır.

IO sınıfı yöntemlerinden biri IO.readlines'dır . Bu yöntem, dosyanın içeriğini satır satır döndürür. Aşağıdaki kod, IO.readlines yönteminin kullanımını görüntüler -

#!/usr/bin/ruby

arr = IO.readlines("input.txt")
puts arr[0]
puts arr[1]

Bu kodda, dizi değişkeni bir dizidir. İnput.txt dosyasının her satırı dizi dizisindeki bir öğe olacaktır. Bu nedenle, arr [0] ilk satırı, arr [1] ise dosyanın ikinci satırını içerecektir.

IO.foreach Yöntemi

Bu yöntem aynı zamanda satır satır çıktı verir. Yöntem arasındaki fark foreach ve yöntem readlines yöntem olup foreach bir blok ile ilişkilidir. Ancak, yöntem okuma satırlarının aksine, foreach yöntemi bir dizi döndürmez. Örneğin -

#!/usr/bin/ruby

IO.foreach("input.txt"){|block| puts block}

Bu kod, dosya testinin içeriğini satır satır değişken bloğa geçirecek ve ardından çıktı ekranda görüntülenecektir.

Dosyaları Yeniden Adlandırma ve Silme

Yeniden adlandırma ve silme yöntemleriyle dosyaları Ruby ile programlı olarak yeniden adlandırabilir ve silebilirsiniz .

Aşağıda, var olan bir dosyayı yeniden adlandırmak için örnek verilmiştir test1.txt -

#!/usr/bin/ruby

# Rename a file from test1.txt to test2.txt
File.rename( "test1.txt", "test2.txt" )

Mevcut bir test2.txt dosyasını silme örneği aşağıdadır -

#!/usr/bin/ruby

# Delete file test2.txt
File.delete("test2.txt")

Dosya Modları ve Sahiplik

Bir dosyanın modunu veya izinlerini / erişim listesini değiştirmek için chmod yöntemini bir maske ile kullanın -

Aşağıda, var olan bir test.txt dosyasının modunu bir maske değerine değiştirmek için örnek verilmiştir -

#!/usr/bin/ruby

file = File.new( "test.txt", "w" )
file.chmod( 0755 )
Sr.No. Maske ve Açıklama
1

0700

sahibi için rwx maskesi

2

0400

sahibi için r

3

0200

w sahibi için

4

0100

sahibi için x

5

0070

grup için rwx maskesi

6

0040

grup için r

7

0020

w grubu için

8

0010

grup için x

9

0007

diğerleri için rwx maskesi

10

0004

diğerleri için r

11

0002

w diğeri için

12

0001

diğeri için x

13

4000

Yürütme sırasında kullanıcı kimliğini ayarlayın

14

2000

Yürütme sırasında grup kimliğini ayarlayın

15

1000

Değiştirilen metni kullandıktan sonra bile kaydedin

Dosya Sorguları

Aşağıdaki komut, açmadan önce bir dosyanın var olup olmadığını test eder -

#!/usr/bin/ruby

File.open("file.rb") if File::exists?( "file.rb" )

Aşağıdaki komut, dosyanın gerçekten bir dosya olup olmadığını sorgular -

#!/usr/bin/ruby

# This returns either true or false
File.file?( "text.txt" )

Aşağıdaki komut, verilen dosya adının bir dizin olup olmadığını bulur -

#!/usr/bin/ruby

# a directory
File::directory?( "/usr/local/bin" ) # => true

# a file
File::directory?( "file.rb" ) # => false

Aşağıdaki komut dosyanın okunabilir mi, yazılabilir mi yoksa yürütülebilir mi olduğunu bulur -

#!/usr/bin/ruby

File.readable?( "test.txt" )   # => true
File.writable?( "test.txt" )   # => true
File.executable?( "test.txt" ) # => false

Aşağıdaki komut dosyanın boyutunun sıfır olup olmadığını bulur -

#!/usr/bin/ruby

File.zero?( "test.txt" )      # => true

Aşağıdaki komut dosyanın boyutunu döndürür -

#!/usr/bin/ruby

File.size?( "text.txt" )     # => 1002

Aşağıdaki komut, bir dosya türünü bulmak için kullanılabilir -

#!/usr/bin/ruby

File::ftype( "test.txt" )     # => file

Ftype yöntemi , dosya, dizin, characterSpecial, blockSpecial, fifo, bağlantı, soket veya bilinmeyenlerden birini döndürerek dosyanın türünü tanımlar .

Aşağıdaki komut, bir dosyanın ne zaman oluşturulduğunu, değiştirildiğini veya en son ne zaman erişildiğini bulmak için kullanılabilir -

#!/usr/bin/ruby

File::ctime( "test.txt" ) # => Fri May 09 10:06:37 -0700 2008
File::mtime( "text.txt" ) # => Fri May 09 10:44:44 -0700 2008
File::atime( "text.txt" ) # => Fri May 09 10:45:01 -0700 2008

Ruby'de Dizinler

Tüm dosyalar çeşitli dizinlerde bulunur ve Ruby bunları işlemekte de sorun yaşamaz. Oysa Dosya sınıfı kolları dosyaları, dizinleri ile işlenir Dir sınıfında.

Dizinler Arasında Gezinme

Bir Ruby programı içindeki dizini değiştirmek için Dir.chdir'i aşağıdaki gibi kullanın . Bu örnek, mevcut dizini / usr / bin olarak değiştirir .

Dir.chdir("/usr/bin")

Dir.pwd ile mevcut dizinin ne olduğunu öğrenebilirsiniz -

puts Dir.pwd # This will return something like /usr/bin

Dizin girişlerini kullanarak belirli bir dizindeki dosyaların ve dizinlerin bir listesini alabilirsiniz -

puts Dir.entries("/usr/bin").join(' ')

Dir.entries , belirtilen dizindeki tüm girişleri içeren bir dizi döndürür. Dir.foreach aynı özelliği sağlar -

Dir.foreach("/usr/bin") do |entry|
   puts entry
end

Dizin listelerini almanın daha da kısa bir yolu, Dir'in sınıf dizi yöntemini kullanmaktır -

Dir["/usr/bin/*"]

Bir Dizin Oluşturma

Dir.mkdir dizinleri oluşturmak için kullanılabilir -

Dir.mkdir("mynewdir")

Ayrıca mkdir ile yeni bir dizinde (zaten var olan bir dizinde değil) izinleri ayarlayabilirsiniz -

NOTE - Maske 755 sahip, grup, dünya [herkes] izinlerini rwxr-xr-x'e ayarlar; burada r = okuma, w = yazma ve x = yürütme.

Dir.mkdir( "mynewdir", 755 )

Bir Dizini Silme

Dir.delete bir dizin silmek için kullanılabilir. Dir.unlink ve Dir.rmdir gerçekleştirir tam olarak aynı işlevi ve kullanım kolaylığı için temin edilmiştir.

Dir.delete("testdir")

Dosyalar ve Geçici Dizinler Oluşturma

Geçici dosyalar, bir programın yürütülmesi sırasında kısaca oluşturulabilen ancak kalıcı bir bilgi deposu olmayan dosyalardır.

Dir.tmpdir , yöntem varsayılan olarak kullanılamasa da, geçerli sistemdeki geçici dizinin yolunu sağlar. Dir.tmpdir'i kullanılabilir kılmak için gerekli 'tmpdir' kullanmak gerekir.

Sen kullanabilirsiniz Dir.tmpdir ile File.join bir platformdan bağımsız geçici dosya oluşturmak için -

require 'tmpdir'
   tempfilename = File.join(Dir.tmpdir, "tingtong")
   tempfile = File.new(tempfilename, "w")
   tempfile.puts "This is a temporary file"
   tempfile.close
   File.delete(tempfilename)

Bu kod, geçici bir dosya oluşturur, ona veri yazar ve onu siler. Ruby'nin standart kitaplığı ayrıca sizin için geçici dosyalar oluşturabilen Tempfile adlı bir kitaplık içerir -

require 'tempfile'
   f = Tempfile.new('tingtong')
   f.puts "Hello"
   puts f.path
   f.close

Yerleşik İşlevler

Dosyaları ve dizinleri işlemek için Ruby'nin yerleşik işlevleri şunlardır -

  • Dosya Sınıfı ve Yöntemleri .

  • Dir Sınıfı ve Yöntemleri .

İnfaz ve istisna her zaman birlikte yürür. Var olmayan bir dosyayı açıyorsanız, bu durumu düzgün bir şekilde ele almadıysanız, programınızın kalitesiz olduğu kabul edilir.

Bir istisna olursa program durur. Bu nedenle istisnalar, bir programın yürütülmesi sırasında meydana gelebilecek çeşitli türdeki hataları işlemek ve programı tamamen durdurmak yerine uygun eylemi gerçekleştirmek için kullanılır.

Ruby, istisnaları ele almak için güzel bir mekanizma sağlar. Bir başlangıç / bitiş bloğuna bir istisna oluşturabilecek kodu ekliyoruz ve Ruby'ye işlemek istediğimiz istisna türlerini söylemek için kurtarma cümlecikleri kullanıyoruz .

Sözdizimi

begin  
# -  
rescue OneTypeOfException  
# -  
rescue AnotherTypeOfException  
# -  
else  
# Other exceptions
ensure
# Always will be executed
end

Her şey başlamak için kurtarma korunur. Bu kod bloğunun yürütülmesi sırasında bir istisna meydana gelirse, kontrol, kurtarma ve sonlandırma arasında bloğa geçirilir .

Başlangıç bloğundaki her bir kurtarma cümlesi için Ruby, yükseltilmiş İstisnayı sırayla her bir parametre ile karşılaştırır. Rescue yan tümcesinde belirtilen istisna, o anda atılan istisnanın türüyle aynıysa veya bu istisnanın bir üst sınıfıysa, eşleşme başarılı olacaktır.

Bir istisnanın belirtilen hata türlerinden hiçbiriyle eşleşmemesi durumunda, tüm kurtarma maddelerinden sonra başka bir cümle kullanmamıza izin verilir .

Misal

#!/usr/bin/ruby

begin
   file = open("/unexistant_file")
   if file
      puts "File opened successfully"
   end
rescue
      file = STDIN
end
print file, "==", STDIN, "\n"

Bu, aşağıdaki sonucu verecektir. Bunu görebilirsiniz STDIN için ikame edilir dosyanın çünkü açık başarısız oldu.

#<IO:0xb7d16f84>==#<IO:0xb7d16f84>

Retry İfadesini kullanma

Sen kullanarak istisna yakalayabilir kurtarma blok ve ardından kullanım yeniden deneme yürütmek deyimi başlamak baştan bloğu.

Sözdizimi

begin
   # Exceptions raised by this code will 
   # be caught by the following rescue clause
rescue
   # This block will capture all types of exceptions
   retry  # This will move control to the beginning of begin
end

Misal

#!/usr/bin/ruby

begin
   file = open("/unexistant_file")
   if file
      puts "File opened successfully"
   end
rescue
   fname = "existant_file"
   retry
end

Aşağıdakiler sürecin akışıdır -

  • Açılışta bir istisna oluştu.
  • Kurtarmaya gitti. fname yeniden atandı.
  • Yeniden deneme ile başlangıcın başına gitti.
  • Bu zaman dosyası başarıyla açılır.
  • Temel süreç devam etti.

NOTE- Yeniden değiştirilmiş ad dosyası yoksa, bu örnek kodun sonsuza kadar yeniden deneneceğine dikkat edin. İstisna süreci için yeniden denemeyi kullanırsanız dikkatli olun .

Yükseltme İfadesini Kullanma

Bir istisna oluşturmak için yükseltme ifadesini kullanabilirsiniz . Aşağıdaki yöntem her çağrıldığında bir istisna oluşturur. İkinci mesaj basılacaktır.

Sözdizimi

raise 

OR

raise "Error Message" 

OR

raise ExceptionType, "Error Message"

OR

raise ExceptionType, "Error Message" condition

İlk biçim, geçerli istisnayı (veya geçerli bir istisna yoksa bir RuntimeError hatası) yeniden yükseltir. Bu, bir istisnayı geçirmeden önce müdahale etmesi gereken istisna işleyicilerinde kullanılır.

İkinci form , mesajını verilen dizeye ayarlayarak yeni bir RuntimeError istisnası oluşturur . Bu istisna daha sonra çağrı yığınını yükseltir.

Üçüncü biçim, bir istisna oluşturmak için ilk bağımsız değişkeni kullanır ve ardından ilişkili mesajı ikinci bağımsız değişkene ayarlar.

Dördüncü formu üçüncü forma benzer ancak sizin gibi koşullu deyimi ekleyebilir sürece bir istisna yükseltmek.

Misal

#!/usr/bin/ruby

begin  
   puts 'I am before the raise.'  
   raise 'An error has occurred.'  
   puts 'I am after the raise.'  
rescue  
   puts 'I am rescued.'  
end  
puts 'I am after the begin block.'

Bu, aşağıdaki sonucu verecektir -

I am before the raise.  
I am rescued.  
I am after the begin block.

Kullanımını gösteren bir örneği daha zam -

#!/usr/bin/ruby

begin  
   raise 'A test exception.'  
rescue Exception => e  
   puts e.message  
   puts e.backtrace.inspect  
end

Bu, aşağıdaki sonucu verecektir -

A test exception.
["main.rb:4"]

Garantiyi kullanma

Bazen, istisna oluşturulmuş olup olmadığına bakılmaksızın, bir kod bloğunun sonunda bazı işlemlerin yapıldığını garanti etmeniz gerekir. Örneğin, bloğa girişte açık bir dosyanız olabilir ve blok çıkarken kapatıldığından emin olmanız gerekir.

Sağlamak fıkra sadece bunu yapar. sure son kurtarma cümlesinden sonra gelir ve blok sona erdiğinde her zaman çalıştırılacak bir kod yığını içerir. Bloğun normal şekilde çıkıp çıkmaması, bir istisnayı artırıp kurtarması veya yakalanmamış bir istisna ile sonlandırılması önemli değildir, garantiye alma bloğu çalışacaktır.

Sözdizimi

begin 
   #.. process 
   #..raise exception
rescue 
   #.. handle error 
ensure 
   #.. finally ensure execution
   #.. This will always execute.
end

Misal

begin
   raise 'A test exception.'
rescue Exception => e
   puts e.message
   puts e.backtrace.inspect
ensure
   puts "Ensuring execution"
end

Bu, aşağıdaki sonucu verecektir -

A test exception.
["main.rb:4"]
Ensuring execution

Else deyimini kullanma

Eğer başka hüküm mevcutsa, bu peşinden gider kurtarma maddeleri ve herhangi önce sağlamak .

Başka bir cümlenin gövdesi, yalnızca ana kod gövdesi tarafından herhangi bir istisna getirilmezse yürütülür.

Sözdizimi

begin 
   #.. process 
   #..raise exception
rescue 
   # .. handle error
else
   #.. executes if there is no exception
ensure 
   #.. finally ensure execution
   #.. This will always execute.
end

Misal

begin
   # raise 'A test exception.'
   puts "I'm not raising exception"
rescue Exception => e
   puts e.message
   puts e.backtrace.inspect
else
   puts "Congratulations-- no errors!"
ensure
   puts "Ensuring execution"
end

Bu, aşağıdaki sonucu verecektir -

I'm not raising exception
Congratulations-- no errors!
Ensuring execution

Hata mesajı $! Kullanılarak yakalanabilir. değişken.

Yakala ve At

Yükseltme ve kurtarmanın istisna mekanizması, işler ters gittiğinde yürütmeyi terk etmek için harika olsa da, bazen normal işlem sırasında derinlemesine iç içe geçmiş bir yapıdan atlayabilmek güzeldir. Bu, yakala ve atmanın işe yaradığı yerdir.

Mandalı (bir sembol veya bir String olabilir) adı verilen ile işaretlenmiş olan bir blok tanımlar. Blok, bir atışla karşılaşılıncaya kadar normal olarak yürütülür.

Sözdizimi

throw :lablename
#.. this will not be executed
catch :lablename do
#.. matching catch will be executed after a throw is encountered.
end

OR

throw :lablename condition
#.. this will not be executed
catch :lablename do
#.. matching catch will be executed after a throw is encountered.
end

Misal

Aşağıdaki örnek, '!' İse kullanıcıyla etkileşimi sonlandırmak için bir fırlatma kullanır. herhangi bir komut istemine yanıt olarak yazılır.

def promptAndGet(prompt)
   print prompt
   res = readline.chomp
   throw :quitRequested if res == "!"
   return res
end

catch :quitRequested do
   name = promptAndGet("Name: ")
   age = promptAndGet("Age: ")
   sex = promptAndGet("Sex: ")
   # ..
   # process information
end
promptAndGet("Name:")

Yukarıdaki programı makinenizde denemelisiniz çünkü manuel etkileşim gerektiriyor. Bu, aşağıdaki sonucu verecektir -

Name: Ruby on Rails
Age: 3
Sex: !
Name:Just Ruby

Sınıf İstisnası

Ruby'nin standart sınıfları ve modülleri istisnaları artırır. Tüm istisna sınıfları, istisna sınıfı en üstte olacak şekilde bir hiyerarşi oluşturur. Sonraki seviye yedi farklı tür içerir -

  • Interrupt
  • NoMemoryError
  • SignalException
  • ScriptError
  • StandardError
  • SystemExit

Bu seviyede başka bir istisna var, Fatal, ancak Ruby yorumlayıcısı bunu yalnızca dahili olarak kullanır.

Hem ScriptError hem de StandardError'ın birkaç alt sınıfı vardır, ancak burada ayrıntılara girmemize gerek yoktur. Önemli olan şu ki, eğer kendi istisna sınıflarımızı yaratırsak, bunların ya İstisna sınıfının ya da onun soyundan birinin alt sınıfları olmaları gerekir.

Bir örneğe bakalım -

class FileSaveError < StandardError
   attr_reader :reason
   def initialize(reason)
      @reason = reason
   end
end

Şimdi, bu istisnayı kullanacak aşağıdaki örneğe bakın -

File.open(path, "w") do |file|
begin
   # Write out the data ...
rescue
   # Something went wrong!
   raise FileSaveError.new($!)
end
end

Buradaki önemli satır, yükseltmek FileSaveError.new ($!) . Bir istisnanın oluştuğunu işaret etmek için yükseltme çağrısı yaparız, buna yeni bir FileSaveError örneği geçiririz, bunun nedeni, belirli istisnanın verilerin yazılmasının başarısız olmasına neden olmasıdır.

Ruby saf bir nesne yönelimli dildir ve her şey Ruby'ye bir nesne olarak görünür. Ruby'deki her değer bir nesnedir, hatta en ilkel şeyler: dizeler, sayılar ve hatta doğru ve yanlış. Bir sınıfın kendisi bile Class sınıfının bir örneği olan bir nesnedir . Bu bölüm sizi Nesne Yönelimli Ruby ile ilgili tüm temel işlevlere götürecektir.

Sınıf, bir nesnenin biçimini belirtmek için kullanılır ve veri gösterimini ve bu verileri tek bir düzgün pakette işlemek için yöntemleri birleştirir. Bir sınıf içindeki veriler ve yöntemler, sınıfın üyeleri olarak adlandırılır.

Ruby Sınıfı Tanımı

Bir sınıf tanımladığınızda, bir veri türü için bir plan tanımlarsınız. Bu aslında herhangi bir veriyi tanımlamaz, ancak sınıf adının ne anlama geldiğini, yani sınıfın bir nesnesinin nelerden oluşacağını ve böyle bir nesne üzerinde hangi işlemlerin gerçekleştirilebileceğini tanımlar.

Bir sınıf tanımı, anahtar kelimeyle başlar class ardından class name ve bir ile sınırlandırılmıştır end. Örneğin, sınıf anahtar kelimesini kullanarak Box sınıfını aşağıdaki gibi tanımladık -

class Box
   code
end

İsim büyük harfle başlamalıdır ve birden fazla kelime içeren kurallara göre isimler her kelime büyük harfle yazılır ve ayırıcı karakterler (CamelCase) kullanılmaz.

Ruby Nesnelerini Tanımlayın

Bir sınıf, nesnelerin planlarını sağlar, bu nedenle temelde bir sınıftan bir nesne oluşturulur. Bir sınıfın nesnelerininewanahtar kelime. Aşağıdaki ifadeler Box sınıfının iki nesnesini bildirir -

box1 = Box.new
box2 = Box.new

Başlatma Yöntemi

initialize method standart bir Ruby sınıfı yöntemidir ve neredeyse aynı şekilde çalışır constructordiğer nesne yönelimli programlama dillerinde çalışır. Başlatma yöntemi, nesne oluşturma sırasında bazı sınıf değişkenlerini başlatmak istediğinizde kullanışlıdır. Bu yöntem bir parametre listesi alabilir ve diğer herhangi bir yakut yöntemi gibi, öncesindedef aşağıda gösterildiği gibi anahtar kelime -

class Box
   def initialize(w,h)
      @width, @height = w, h
   end
end

Örnek Değişkenler

instance variablesbir tür sınıf nitelikleridir ve sınıf kullanılarak nesneler oluşturulduğunda nesnelerin özellikleri haline gelirler. Her nesnenin nitelikleri ayrı ayrı atanır ve diğer nesnelerle hiçbir değeri paylaşmaz. Sınıf içinde @ operatörü kullanılarak erişilir, ancak kullandığımız sınıfın dışında bunlara erişmek içinpublic denilen yöntemler accessor methods. Yukarıda tanımlanan sınıfı alırsakBox @width ve @height, Box sınıfı için örnek değişkenlerdir.

class Box
   def initialize(w,h)
      # assign instance variables
      @width, @height = w, h
   end
end

Erişimci ve ayarlayıcı Yöntemleri

Değişkenleri sınıfın dışından kullanılabilir kılmak için, bunların içinde tanımlanmaları gerekir. accessor methodsbu erişimci yöntemleri aynı zamanda alıcı yöntemler olarak da bilinir. Aşağıdaki örnek, erişimci yöntemlerinin kullanımını göstermektedir -

#!/usr/bin/ruby -w

# define a class
class Box
   # constructor method
   def initialize(w,h)
      @width, @height = w, h
   end

   # accessor methods
   def printWidth
      @width
   end

   def printHeight
      @height
   end
end

# create an object
box = Box.new(10, 20)

# use accessor methods
x = box.printWidth()
y = box.printHeight()

puts "Width of the box is : #{x}"
puts "Height of the box is : #{y}"

Yukarıdaki kod çalıştırıldığında, aşağıdaki sonucu verir -

Width of the box is : 10
Height of the box is : 20

Değişkenlerin değerine erişmek için kullanılan erişimci yöntemlerine benzer şekilde, Ruby bu değişkenlerin değerlerini sınıfın dışından ayarlamak için bir yol sağlar. setter methodsaşağıdaki gibi tanımlananlar -

#!/usr/bin/ruby -w

# define a class
class Box
   # constructor method
   def initialize(w,h)
      @width, @height = w, h
   end

   # accessor methods
   def getWidth
      @width
   end
   def getHeight
      @height
   end

   # setter methods
   def setWidth=(value)
      @width = value
   end
   def setHeight=(value)
      @height = value
   end
end

# create an object
box = Box.new(10, 20)

# use setter methods
box.setWidth = 30
box.setHeight = 50

# use accessor methods
x = box.getWidth()
y = box.getHeight()

puts "Width of the box is : #{x}"
puts "Height of the box is : #{y}"

Yukarıdaki kod çalıştırıldığında, aşağıdaki sonucu verir -

Width of the box is : 30
Height of the box is : 50

Örnek Yöntemler

instance methods aynı zamanda başka herhangi bir yöntemi kullanarak tanımladığımız şekilde tanımlanır defanahtar kelime ve bunlar yalnızca aşağıda gösterildiği gibi bir sınıf örneği kullanılarak kullanılabilir. İşlevleri, örnek değişkenlerine erişimle sınırlı değildir, aynı zamanda ihtiyacınıza göre çok daha fazlasını da yapabilirler.

#!/usr/bin/ruby -w

# define a class
class Box
   # constructor method
   def initialize(w,h)
      @width, @height = w, h
   end
   # instance method
   def getArea
      @width * @height
   end
end

# create an object
box = Box.new(10, 20)

# call instance methods
a = box.getArea()
puts "Area of the box is : #{a}"

Yukarıdaki kod çalıştırıldığında, aşağıdaki sonucu verir -

Area of the box is : 200

Sınıf Yöntemler ve Değişkenler

class variablesbir sınıfın tüm örnekleri arasında paylaşılan bir değişkendir. Başka bir deyişle, değişkenin bir örneği vardır ve buna nesne örnekleri tarafından erişilir. Sınıf değişkenlerinin önünde iki @ karakter (@@) bulunur. Bir sınıf değişkeni, aşağıda gösterildiği gibi sınıf tanımı içinde başlatılmalıdır.

Bir sınıf yöntemi kullanılarak tanımlanır def self.methodname(), son sınırlayıcı ile biten ve sınıf adı olarak kullanılarak çağrılacak classname.methodname aşağıdaki örnekte gösterildiği gibi -

#!/usr/bin/ruby -w

class Box
   # Initialize our class variables
   @@count = 0
   def initialize(w,h)
      # assign instance avriables
      @width, @height = w, h

      @@count += 1
   end

   def self.printCount()
      puts "Box count is : #@@count"
   end
end

# create two object
box1 = Box.new(10, 20)
box2 = Box.new(30, 100)

# call class method to print box count
Box.printCount()

Yukarıdaki kod çalıştırıldığında, aşağıdaki sonucu verir -

Box count is : 2

To_s Yöntemi

Tanımladığınız herhangi bir sınıfın bir to_snesnenin dize gösterimini döndürmek için örnek yöntem. Aşağıda, bir Box nesnesini genişlik ve yükseklik açısından temsil etmek için basit bir örnek verilmiştir -

#!/usr/bin/ruby -w

class Box
   # constructor method
   def initialize(w,h)
      @width, @height = w, h
   end
   # define to_s method
   def to_s
      "(w:#@width,h:#@height)"  # string formatting of the object.
   end
end

# create an object
box = Box.new(10, 20)

# to_s method will be called in reference of string automatically.
puts "String representation of box is : #{box}"

Yukarıdaki kod çalıştırıldığında, aşağıdaki sonucu verir -

String representation of box is : (w:10,h:20)

Giriş kontrolu

Ruby, örnek yöntemleri düzeyinde size üç koruma düzeyi sağlar; public, private, or protected. Ruby, örnek ve sınıf değişkenleri üzerinde herhangi bir erişim denetimi uygulamaz.

  • Public Methods- Herkese açık yöntemler herkes tarafından çağrılabilir. Her zaman özel olan başlatma dışında yöntemler varsayılan olarak geneldir.

  • Private Methods- Özel yöntemlere erişilemez ve hatta sınıfın dışından görüntülenemez. Özel üyelere yalnızca sınıf yöntemleri erişebilir.

  • Protected Methods- Korumalı bir yöntem yalnızca tanımlayıcı sınıfın nesneleri ve alt sınıfları tarafından çağrılabilir. Erişim aile içinde tutulur.

Aşağıda, üç erişim değiştiricinin tümünün sözdizimini gösteren basit bir örnek verilmiştir -

#!/usr/bin/ruby -w

# define a class
class Box
   # constructor method
   def initialize(w,h)
      @width, @height = w, h
   end

   # instance method by default it is public
   def getArea
      getWidth() * getHeight
   end

   # define private accessor methods
   def getWidth
      @width
   end
   def getHeight
      @height
   end
   # make them private
   private :getWidth, :getHeight

   # instance method to print area
   def printArea
      @area = getWidth() * getHeight
      puts "Big box area is : #@area"
   end
   # make it protected
   protected :printArea
end

# create an object
box = Box.new(10, 20)

# call instance methods
a = box.getArea()
puts "Area of the box is : #{a}"

# try to call protected or methods
box.printArea()

Yukarıdaki kod çalıştırıldığında aşağıdaki sonucu verir. Burada birinci yöntem başarıyla çağrılırken, ikinci yöntem sorun yaratmıştır.

Area of the box is : 200
test.rb:42: protected method `printArea' called for #
<Box:0xb7f11280 @height = 20, @width = 10> (NoMethodError)

Sınıf Mirası

Nesne yönelimli programlamadaki en önemli kavramlardan biri kalıtımdır. Kalıtım, bir sınıfı başka bir sınıf açısından tanımlamamıza izin verir, bu da bir uygulama oluşturmayı ve sürdürmeyi kolaylaştırır.

Kalıtım ayrıca kod işlevselliğini ve hızlı uygulama süresini yeniden kullanma fırsatı da sağlar, ancak maalesef Ruby birden fazla kalıtım düzeyini desteklemez ancak Ruby destekler mixins. Bir karışım, yalnızca arayüz kısmının miras alındığı çoklu kalıtımın özelleştirilmiş bir uygulaması gibidir.

Bir sınıf oluştururken, tamamen yeni veri üyeleri ve üye işlevler yazmak yerine, programcı yeni sınıfın mevcut bir sınıfın üyelerini miras alması gerektiğini belirleyebilir. Bu mevcut sınıfabase class or superclassve yeni sınıfa, derived class or sub-class.

Ruby ayrıca alt sınıflandırma, yani kalıtım kavramını da destekler ve aşağıdaki örnek kavramı açıklar. Bir sınıfı genişletmenin sözdizimi basittir. Sınıf ifadenize bir <karakteri ve üst sınıfın adını eklemeniz yeterlidir. Örneğin, aşağıdaki bir sınıf BigBox'ı Box'ın bir alt sınıfı olarak tanımlayın -

#!/usr/bin/ruby -w

# define a class
class Box
   # constructor method
   def initialize(w,h)
      @width, @height = w, h
   end
   # instance method
   def getArea
      @width * @height
   end
end

# define a subclass
class BigBox < Box

   # add a new instance method
   def printArea
      @area = @width * @height
      puts "Big box area is : #@area"
   end
end

# create an object
box = BigBox.new(10, 20)

# print the area
box.printArea()

Yukarıdaki kod çalıştırıldığında, aşağıdaki sonucu verir -

Big box area is : 200

Geçersiz Kılma Yöntemleri

Türetilmiş bir sınıfa yeni işlevler ekleyebilseniz de, ancak bazen bir üst sınıfta önceden tanımlanmış yöntemin davranışını değiştirmek istersiniz. Bunu, yöntem adını aynı tutarak ve aşağıdaki örnekte gösterildiği gibi yöntemin işlevselliğini geçersiz kılarak yapabilirsiniz -

#!/usr/bin/ruby -w

# define a class
class Box
   # constructor method
   def initialize(w,h)
      @width, @height = w, h
   end
   # instance method
   def getArea
      @width * @height
   end
end

# define a subclass
class BigBox < Box

   # change existing getArea method as follows
   def getArea
      @area = @width * @height
      puts "Big box area is : #@area"
   end
end

# create an object
box = BigBox.new(10, 20)

# print the area using overriden method.
box.getArea()

Operatör Aşırı Yüklemesi

+ Operatörünün + kullanarak iki Box nesnesinin vektör toplamasını, * operatörünün bir Box genişliğini ve yüksekliğini bir skaler ile çarpmasını ve tekli - operatörünün Box'ın genişliğini ve yüksekliğini olumsuzlamasını istiyoruz. Burada, matematiksel işleçlerin tanımlandığı Box sınıfının bir sürümü verilmiştir -

class Box
   def initialize(w,h)     # Initialize the width and height
      @width,@height = w, h
   end

   def +(other)       # Define + to do vector addition
      Box.new(@width + other.width, @height + other.height)
   end

   def -@           # Define unary minus to negate width and height
      Box.new(-@width, -@height)
   end

   def *(scalar)           # To perform scalar multiplication
      Box.new(@width*scalar, @height*scalar)
   end
end

Nesneleri Dondurmak

Bazen bir nesnenin değiştirilmesini önlemek isteriz. Object'teki dondurma yöntemi, bir nesneyi etkin bir şekilde sabit hale getirerek bunu yapmamızı sağlar. Herhangi bir nesne çağırılarak dondurulabilirObject.freeze. Dondurulmuş bir nesne değiştirilemez: onun örnek değişkenlerini değiştiremezsiniz.

Belirli bir nesnenin donmuş olup olmadığını kontrol edebilirsiniz. Object.frozen?yöntem, nesnenin donması durumunda true değerini döndürür, aksi takdirde yanlış bir değer döndürülür. Aşağıdaki örnek kavramı netleştirir -

#!/usr/bin/ruby -w

# define a class
class Box
   # constructor method
   def initialize(w,h)
      @width, @height = w, h
   end

   # accessor methods
   def getWidth
      @width
   end
   def getHeight
      @height
   end

   # setter methods
   def setWidth=(value)
      @width = value
   end
   def setHeight=(value)
      @height = value
   end
end

# create an object
box = Box.new(10, 20)

# let us freez this object
box.freeze
if( box.frozen? )
   puts "Box object is frozen object"
else
   puts "Box object is normal object"
end

# now try using setter methods
box.setWidth = 30
box.setHeight = 50

# use accessor methods
x = box.getWidth()
y = box.getHeight()

puts "Width of the box is : #{x}"
puts "Height of the box is : #{y}"

Yukarıdaki kod çalıştırıldığında, aşağıdaki sonucu verir -

Box object is frozen object
test.rb:20:in `setWidth=': can't modify frozen object (TypeError)
   from test.rb:39

Sınıf Sabitleri

Bir değişkene, @ veya @@ kullanılmadan tanımlanan bir doğrudan sayısal veya dize değeri atayarak bir sınıf içinde bir sabit tanımlayabilirsiniz. Geleneksel olarak, sabit isimleri büyük harfle tutuyoruz.

Bir sabit tanımlandıktan sonra, değerini değiştiremezsiniz, ancak bir değişkene çok benzer şekilde bir sınıfın içinden doğrudan bir sabite erişebilirsiniz, ancak sınıfın dışındaki bir sabite erişmek istiyorsanız, classname::constant aşağıdaki örnekte gösterildiği gibi.

#!/usr/bin/ruby -w

# define a class
class Box
   BOX_COMPANY = "TATA Inc"
   BOXWEIGHT = 10
   # constructor method
   def initialize(w,h)
      @width, @height = w, h
   end
   # instance method
   def getArea
      @width * @height
   end
end

# create an object
box = Box.new(10, 20)

# call instance methods
a = box.getArea()
puts "Area of the box is : #{a}"
puts Box::BOX_COMPANY
puts "Box weight is: #{Box::BOXWEIGHT}"

Yukarıdaki kod çalıştırıldığında, aşağıdaki sonucu verir -

Area of the box is : 200
TATA Inc
Box weight is: 10

Sınıf sabitleri miras alınır ve örnek yöntemleri gibi geçersiz kılınabilir.

Allocate Kullanarak Nesne Oluşturun

Yapıcısını çağırmadan bir nesne oluşturmak istediğinizde bir durum olabilir. initializeör. yeni yöntemi kullanarak, böyle bir durumda ayırmayı çağırabilirsiniz , bu da sizin için aşağıdaki örnekte olduğu gibi başlatılmamış bir nesne yaratacaktır -

#!/usr/bin/ruby -w

# define a class
class Box
   attr_accessor :width, :height

   # constructor method
   def initialize(w,h)
      @width, @height = w, h
   end

   # instance method
   def getArea
      @width * @height
   end
end

# create an object using new
box1 = Box.new(10, 20)

# create another object using allocate
box2 = Box.allocate

# call instance method using box1
a = box1.getArea()
puts "Area of the box is : #{a}"

# call instance method using box2
a = box2.getArea()
puts "Area of the box is : #{a}"

Yukarıdaki kod çalıştırıldığında, aşağıdaki sonucu verir -

Area of the box is : 200
test.rb:14: warning: instance variable @width not initialized
test.rb:14: warning: instance variable @height not initialized
test.rb:14:in `getArea': undefined method `*' 
   for nil:NilClass (NoMethodError) from test.rb:29

Sınıf Bilgileri

Sınıf tanımları çalıştırılabilir kodsa, bu onların bir nesne bağlamında yürütüldüğü anlamına gelir: self bir şeye başvurmalıdır. Ne olduğunu öğrenelim.

#!/usr/bin/ruby -w

class Box
   # print class information
   puts "Type of self = #{self.type}"
   puts "Name of self = #{self.name}"
end

Yukarıdaki kod çalıştırıldığında, aşağıdaki sonucu verir -

Type of self = Class
Name of self = Box

Bu, bir sınıf tanımının o sınıfla geçerli nesne olarak yürütüldüğü anlamına gelir. Bu, meta sınıftaki ve üst sınıflarındaki yöntemlerin, yöntem tanımının yürütülmesi sırasında kullanılabilir olacağı anlamına gelir.

Bir düzenli ifade eşleşmesi veya desende düzenlenen bir uzman sözdizimi kullanarak dizeleri diğer dizeleri veya setleri bulmanıza yardımcı karakterlerin özel dizisidir.

Bir normal düz ifade eğik çizgiler arasında ya da aşağıdaki gibi% r ve ardından rasgele ayraçları arasındaki bir kalıptır -

Sözdizimi

/pattern/
/pattern/im    # option can be specified
%r!/usr/local! # general delimited regular expression

Misal

#!/usr/bin/ruby

line1 = "Cats are smarter than dogs";
line2 = "Dogs also like meat";

if ( line1 =~ /Cats(.*)/ )
   puts "Line1 contains Cats"
end
if ( line2 =~ /Cats(.*)/ )
   puts "Line2 contains  Dogs"
end

Bu, aşağıdaki sonucu verecektir -

Line1 contains Cats

Normal İfade Değiştiriciler

Normal ifade değişmezleri, eşleşmenin çeşitli yönlerini kontrol etmek için isteğe bağlı bir değiştirici içerebilir. Değiştirici, daha önce gösterildiği gibi ikinci eğik çizgi karakterinden sonra belirtilir ve bu karakterlerden biriyle gösterilebilir -

Sr.No. Değiştirici ve Açıklama
1

i

Metin eşleştirirken büyük / küçük harf kullanımını göz ardı eder.

2

o

# {} Enterpolasyonunu yalnızca bir kez, normal ifade ilk kez değerlendirildiğinde gerçekleştirir.

3

x

Boşluğu yok sayar ve normal ifadelerde yorumlara izin verir.

4

m

Yeni satırları normal karakterler olarak tanıyarak birden çok satırla eşleşir.

5

u,e,s,n

Normal ifadeyi Unicode (UTF-8), EUC, SJIS veya ASCII olarak yorumlar. Bu değiştiricilerden hiçbiri belirtilmezse, normal ifadenin kaynak kodlamasını kullandığı varsayılır.

% Q ile sınırlandırılmış dize değişmezleri gibi, Ruby de normal ifadelerinize% r ve ardından seçtiğiniz bir sınırlayıcı ile başlamanıza izin verir. Bu, tanımladığınız desen kaçmak istemediğiniz çok sayıda eğik çizgi karakteri içerdiğinde kullanışlıdır -

# Following matches a single slash character, no escape required
%r|/|

# Flag characters are allowed with this syntax, too
%r[</(.*)>]i

Normal İfade Kalıpları

Kontrol karakterleri hariç, (+ ? . * ^ $ ( ) [ ] { } | \), tüm karakterler kendileriyle eşleşir. Bir kontrol karakterinin önüne ters eğik çizgi koyarak kaçabilirsiniz.

Sr.No. Desen ve Açıklama
1

^

Satırın başıyla eşleşir.

2

$

Satırın sonuyla eşleşir.

3

.

Yeni satır hariç herhangi bir tek karakterle eşleşir. M seçeneğini kullanmak, satırsonu ile eşleşmesine de izin verir.

4

[...]

Parantez içindeki herhangi bir tek karakterle eşleşir.

5

[^...]

Parantez içinde olmayan herhangi bir karakterle eşleşir

6

re*

Önceki ifadenin 0 veya daha fazla oluşumuyla eşleşir.

7

re+

Önceki ifadenin 1 veya daha fazla oluşumuyla eşleşir.

8

re?

Önceki ifadenin 0 veya 1 oluşumuyla eşleşir.

9

re{ n}

Önceki ifadenin tam olarak n sayıda oluşumuyla eşleşir.

10

re{ n,}

Önceki ifadenin n veya daha fazla oluşumuyla eşleşir.

11

re{ n, m}

Önceki ifadenin en az n ve en çok m oluşumuyla eşleşir.

12

a| b

A veya b ile eşleşir.

13

(re)

Normal ifadeleri gruplandırır ve eşleşen metni hatırlar.

14

(?imx)

Normal bir ifade içinde geçici olarak i, m veya x seçenekleri arasında geçiş yapar. Parantez içindeyse, yalnızca o alan etkilenir.

15

(?-imx)

Normal bir ifade içindeki i, m veya x seçeneklerini geçici olarak kapatır. Parantez içindeyse, yalnızca o alan etkilenir.

16

(?: re)

Normal ifadeleri eşleşen metni hatırlamadan gruplar.

17

(?imx: re)

Parantez içindeki i, m veya x seçeneklerini geçici olarak değiştirir.

18

(?-imx: re)

Parantez içindeki i, m veya x seçeneklerini geçici olarak kapatır.

19

(?#...)

Yorum Yap.

20

(?= re)

Bir model kullanarak konumu belirtir. Aralığı yok.

21

(?! re)

Kalıp olumsuzlamasını kullanarak konumu belirtir. Aralığı yok.

22

(?> re)

Geriye dönük izleme olmaksızın bağımsız desenle eşleşir.

23

\w

Kelime karakterleriyle eşleşir.

24

\W

Sözcük olmayan karakterlerle eşleşir.

25

\s

Boşluklarla eşleşir. [\ T \ n \ r \ f] ile eşdeğerdir.

26

\S

Beyaz olmayan boşlukla eşleşir.

27

\d

Rakamlarla eşleşir. [0-9] ile eşdeğerdir.

28

\D

Sayı olmayanlarla eşleşir.

29

\A

Dizenin başıyla eşleşir.

30

\Z

Dizenin sonuyla eşleşir. Bir satırsonu varsa, yeni satırdan hemen önce eşleşir.

31

\z

Dizenin sonuyla eşleşir.

32

\G

Maçlar son maçın bittiği yeri gösterir.

33

\b

Köşeli parantezlerin dışındayken kelime sınırlarıyla eşleşir. Parantez içindeyken geri boşlukla (0x08) eşleşir.

34

\B

Kelime olmayan sınırlarla eşleşir.

35

\n, \t, etc.

Yeni satırlarla, satır başlarıyla, sekmelerle vb. Eşleşir.

36

\1...\9

N'inci gruplanmış alt ifadeyle eşleşir.

37

\10

Matches nth grouped subexpression if it matched already. Otherwise refers to the octal representation of a character code.

Regular-Expression Examples

Sr.No. Example & Description
1

/ruby/

Matches "ruby".

2

¥

Matches Yen sign. Multibyte characters are supported in Ruby 1.9 and Ruby 1.8.

Sr.No. Example & Description
1

/[Rr]uby/

Matches "Ruby" or "ruby".

2

/rub[ye]/

Matches "ruby" or "rube".

3

/[aeiou]/

Matches any one lowercase vowel.

4

/[0-9]/

Matches any digit; same as /[0123456789]/.

5

/[a-z]/

Matches any lowercase ASCII letter.

6

/[A-Z]/

Matches any uppercase ASCII letter.

7

/[a-zA-Z0-9]/

Matches any of the above.

8

/[^aeiou]/

Matches anything other than a lowercase vowel.

9

/[^0-9]/

Matches anything other than a digit.

Sr.No. Example & Description
1

/./

Matches any character except newline.

2

/./m

In multi-line mode, matches newline, too.

3

/\d/

Matches a digit: /[0-9]/.

4

/\D/

Matches a non-digit: /[^0-9]/.

5

/\s/

Matches a whitespace character: /[ \t\r\n\f]/.

6

/\S/

Matches non-whitespace: /[^ \t\r\n\f]/.

7

/\w/

Matches a single word character: /[A-Za-z0-9_]/.

8

/\W/

Matches a non-word character: /[^A-Za-z0-9_]/.

Sr.No. Example & Description
1

/ruby?/

Matches "rub" or "ruby": the y is optional.

2

/ruby*/

Matches "rub" plus 0 or more ys.

3

/ruby+/

Matches "rub" plus 1 or more ys.

4

/\d{3}/

Matches exactly 3 digits.

5

/\d{3,}/

Matches 3 or more digits.

6

/\d{3,5}/

Matches 3, 4, or 5 digits.

This matches the smallest number of repetitions −

Sr.No. Example & Description
1

/<.*>/

Greedy repetition: matches "<ruby>perl>".

2

/<.*?>/

Non-greedy: matches "<ruby>" in "<ruby>perl>".

Sr.No. Example & Description
1

/\D\d+/

No group: + repeats \d

2

/(\D\d)+/

Grouped: + repeats \D\d pair

3

/([Rr]uby(, )?)+/

Match "Ruby", "Ruby, ruby, ruby", etc.

This matches a previously matched group again −

Sr.No. Example & Description
1

/([Rr])uby&\1ails/

Matches ruby&rails or Ruby&Rails.

2

/(['"])(?:(?!\1).)*\1/

Single or double-quoted string. \1 matches whatever the 1st group matched . \2 matches whatever the 2nd group matched, etc.

Sr.No. Example & Description
1

/ruby|rube/

Matches "ruby" or "rube".

2

/rub(y|le))/

Matches "ruby" or "ruble".

3

/ruby(!+|\?)/

"ruby" followed by one or more ! or one ?

It needs to specify match position.

Sr.No. Example & Description
1

/^Ruby/

Matches "Ruby" at the start of a string or internal line.

2

/Ruby$/

Matches "Ruby" at the end of a string or line.

3

/\ARuby/

Matches "Ruby" at the start of a string.

4

/Ruby\Z/

Matches "Ruby" at the end of a string.

5

/\bRuby\b/

Matches "Ruby" at a word boundary.

6

/\brub\B/

\B is non-word boundary: matches "rub" in "rube" and "ruby" but not alone.

7

/Ruby(?=!)/

Matches "Ruby", if followed by an exclamation point.

8

/Ruby(?!!)/

Matches "Ruby", if not followed by an exclamation point.

Sr.No. Example & Description
1

/R(?#comment)/

Matches "R". All the rest is a comment.

2

/R(?i)uby/

Case-insensitive while matching "uby".

3

/R(?i:uby)/

Same as above.

4

/rub(?:y|le))/

Group only without creating \1 backreference.

Search and Replace

Some of the most important String methods that use regular expressions are sub and gsub, and their in-place variants sub! and gsub!.

All of these methods perform a search-and-replace operation using a Regexp pattern. The sub & sub! replaces the first occurrence of the pattern and gsub & gsub! replaces all occurrences.

The sub and gsub returns a new string, leaving the original unmodified where as sub! and gsub! modify the string on which they are called.

Following is the example −

#!/usr/bin/ruby

phone = "2004-959-559 #This is Phone Number"

# Delete Ruby-style comments
phone = phone.sub!(/#.*$/, "")   
puts "Phone Num : #{phone}"

# Remove anything other than digits
phone = phone.gsub!(/\D/, "")    
puts "Phone Num : #{phone}"

This will produce the following result −

Phone Num : 2004-959-559
Phone Num : 2004959559

Following is another example −

#!/usr/bin/ruby

text = "rails are rails, really good Ruby on Rails"

# Change "rails" to "Rails" throughout
text.gsub!("rails", "Rails")

# Capitalize the word "Rails" throughout
text.gsub!(/\brails\b/, "Rails")
puts "#{text}"

Bu, aşağıdaki sonucu verecektir -

Rails are Rails, really good Ruby on Rails

Bu bölüm Ruby kullanarak bir veritabanına nasıl erişeceğinizi öğretir. Yakut DBI modülü Perl DBI modülü benzer Ruby komut dosyaları için bir veritabanı bağımsız arayüz sağlar.

DBI, Ruby için Veritabanından Bağımsız Arayüz anlamına gelir; bu, DBI'nın Ruby kodu ile temeldeki veritabanı arasında bir soyutlama katmanı sağladığı ve veritabanı uygulamalarını gerçekten kolayca değiştirmenize izin verdiği anlamına gelir. Kullanılan gerçek veritabanından bağımsız olarak tutarlı bir veritabanı arabirimi sağlayan bir dizi yöntemi, değişkeni ve kuralı tanımlar.

DBI aşağıdakilerle arayüz oluşturabilir -

  • ADO (ActiveX Veri Nesneleri)
  • DB2
  • Frontbase
  • mSQL
  • MySQL
  • ODBC
  • Oracle
  • OCI8 (Oracle)
  • PostgreSQL
  • Proxy/Server
  • SQLite
  • SQLRelay

DBI Uygulamasının Mimarisi

DBI, arka uçta bulunan herhangi bir veritabanından bağımsızdır. Oracle, MySQL veya Informix vb. İle çalışıyor olsanız da DBI kullanabilirsiniz. Bu, aşağıdaki mimari diyagramdan anlaşılır.

Ruby DBI için genel mimari iki katman kullanır -

  • Veritabanı arabirimi (DBI) katmanı. Bu katman veritabanından bağımsızdır ve iletişim kurduğunuz veritabanı sunucusunun türüne bakılmaksızın aynı şekilde kullanılan bir dizi ortak erişim yöntemi sağlar.

  • Veritabanı sürücüsü (DBD) katmanı. Bu katman veritabanına bağlıdır; farklı sürücüler, farklı veritabanı motorlarına erişim sağlar. MySQL için bir sürücü, PostgreSQL için bir sürücü, InterBase için bir sürücü, Oracle için bir sürücü ve diğerleri vardır. Her sürücü, DBI katmanından gelen istekleri yorumlar ve bunları belirli bir veritabanı sunucusu türüne uygun isteklerle eşler.

Önkoşullar

MySQL veritabanlarına erişmek için Ruby komut dosyaları yazmak istiyorsanız, Ruby MySQL modülünün kurulu olması gerekir.

Bu modül, yukarıda açıklandığı gibi bir DBD görevi görür ve şu adresten indirilebilir: https://www.tmtm.org/en/mysql/ruby/

Ruby / DBI Edinme ve Yükleme

Ruby DBI modülünü aşağıdaki konumdan indirip kurabilirsiniz -

https://imgur.com/NFEuWe4/embed

Bu kuruluma başlamadan önce, root ayrıcalığına sahip olduğunuzdan emin olun. Şimdi, aşağıda verilen adımları izleyin -

Aşama 1

$ tar zxf dbi-0.2.0.tar.gz

Adım 2

Dbi -0.2.0 dağıtım dizinine gidin ve bu dizindeki setup.rb komut dosyasını kullanarak yapılandırın . En genel konfigürasyon komutu, config argümanını takip eden hiçbir argüman olmaksızın buna benzer. Bu komut, dağıtımı varsayılan olarak tüm sürücüleri yükleyecek şekilde yapılandırır.

$ ruby setup.rb config

Daha spesifik olmak gerekirse, dağıtımın kullanmak istediğiniz belirli bölümlerini listeleyen bir --with seçeneği sağlayın. Örneğin, yalnızca ana DBI modülünü ve MySQL DBD düzeyi sürücüyü yapılandırmak için aşağıdaki komutu verin -

$ ruby setup.rb config --with = dbi,dbd_mysql

Aşama 3

Son adım, sürücüyü oluşturmak ve aşağıdaki komutları kullanarak kurmaktır -

$ ruby setup.rb setup $ ruby setup.rb install

Veritabanı Bağlantısı

MySQL veritabanıyla çalışacağımızı varsayarsak, bir veritabanına bağlanmadan önce aşağıdakilerden emin olun -

  • Bir TESTDB veritabanı oluşturdunuz.

  • TESTDB'de EMPLOYEE oluşturdunuz.

  • Bu tablo FIRST_NAME, LAST_NAME, AGE, SEX ve INCOME alanlarına sahip.

  • "Testuser" kullanıcı kimliği ve "test123" şifresi TESTDB'ye erişmek için ayarlanmıştır.

  • Ruby Module DBI, makinenize doğru bir şekilde kurulmuş.

  • MySQL Temellerini anlamak için MySQL eğitiminden geçtiniz.

Aşağıda MySQL veritabanı "TESTDB" ile bağlantı kurma örneği verilmiştir

#!/usr/bin/ruby -w

require "dbi"

begin
   # connect to the MySQL server
   dbh = DBI.connect("DBI:Mysql:TESTDB:localhost", "testuser", "test123")
   # get server version string and display it
   row = dbh.select_one("SELECT VERSION()")
   puts "Server version: " + row[0]
rescue DBI::DatabaseError => e
   puts "An error occurred"
   puts "Error code:    #{e.err}"
   puts "Error message: #{e.errstr}"
ensure
   # disconnect from server
   dbh.disconnect if dbh
end

Bu betiği çalıştırırken, Linux makinemizde aşağıdaki sonucu verir.

Server version: 5.0.45

Veri kaynağıyla bir bağlantı kurulursa, bir Veritabanı Tutacağı döndürülür ve dbh aksi takdirde daha fazla kullanım için dbhnil değerine ayarlanmıştır ve e.err ve e :: errstr sırasıyla hata kodu ve bir hata dizgesini döndürür.

Son olarak, çıkmadan önce veritabanı bağlantısının kapatıldığından ve kaynakların serbest bırakıldığından emin olun.

INSERT İşlemi

Kayıtlarınızı bir veritabanı tablosunda oluşturmak istediğinizde INSERT işlemi gereklidir.

Bir veritabanı bağlantısı kurulduktan sonra, kullanarak veritabanı tablolarına tablolar veya kayıtlar oluşturmaya hazırız. do yöntem veya prepare ve execute yöntem.

Do İfadesini Kullanma

Satır döndürmeyen ifadeler, doveritabanı işleme yöntemi. Bu yöntem, bir ifade dizesi bağımsız değişkeni alır ve ifadeden etkilenen satırların sayısını döndürür.

dbh.do("DROP TABLE IF EXISTS EMPLOYEE")
dbh.do("CREATE TABLE EMPLOYEE (
   FIRST_NAME  CHAR(20) NOT NULL,
   LAST_NAME  CHAR(20),
   AGE INT,  
   SEX CHAR(1),
   INCOME FLOAT )" );

Benzer şekilde, EMPLOYEE tablosunda bir kayıt oluşturmak için SQL INSERT deyimini çalıştırabilirsiniz .

#!/usr/bin/ruby -w

require "dbi"

begin
   # connect to the MySQL server
   dbh = DBI.connect("DBI:Mysql:TESTDB:localhost", "testuser", "test123")
   dbh.do( "INSERT INTO EMPLOYEE(FIRST_NAME, LAST_NAME, AGE, SEX, INCOME)
      VALUES ('Mac', 'Mohan', 20, 'M', 2000)" )
   puts "Record has been created"
   dbh.commit
rescue DBI::DatabaseError => e
   puts "An error occurred"
   puts "Error code:    #{e.err}"
   puts "Error message: #{e.errstr}"
   dbh.rollback
ensure
   # disconnect from server
   dbh.disconnect if dbh
end

Hazırla ve yürüt özelliğini kullanma

SQL ifadesini Ruby kodu aracılığıyla yürütmek için DBI sınıfının hazırlama ve yürütme yöntemlerini kullanabilirsiniz .

Kayıt oluşturma aşağıdaki adımları gerçekleştirir -

  • INSERT deyimiyle SQL deyiminin hazırlanması. Bu, kullanılarak yapılacaktır.prepare yöntem.

  • Veritabanından tüm sonuçları seçmek için SQL sorgusunun yürütülmesi. Bu, kullanılarak yapılacaktır.execute yöntem.

  • Serbest bırakma İfadesi tutamacı. Bu kullanılarak yapılacaktırfinish API

  • Her şey yolunda giderse, o zaman commit bu işlem yoksa yapabilirsin rollback tam işlem.

Bu iki yöntemi kullanmak için sözdizimi aşağıdadır -

sth = dbh.prepare(statement)
sth.execute
   ... zero or more SQL operations ...
sth.finish

Bu iki yöntem geçmek için kullanılabilir bindSQL ifadelerine değerler. Girilecek değerlerin önceden verilmediği bir durum olabilir. Böyle bir durumda bağlanma değerleri kullanılır. Bir soru işareti (?) gerçek değerler yerine kullanılır ve ardından gerçek değerler execute () API üzerinden geçirilir.

EMPLOYEE tablosunda iki kayıt oluşturmak için örnek aşağıdadır -

#!/usr/bin/ruby -w

require "dbi"

begin
   # connect to the MySQL server
   dbh = DBI.connect("DBI:Mysql:TESTDB:localhost", "testuser", "test123")
   sth = dbh.prepare( "INSERT INTO EMPLOYEE(FIRST_NAME, LAST_NAME, AGE, SEX, INCOME)
      VALUES (?, ?, ?, ?, ?)" )
   sth.execute('John', 'Poul', 25, 'M', 2300)
   sth.execute('Zara', 'Ali', 17, 'F', 1000)
   sth.finish
   dbh.commit
   puts "Record has been created"
rescue DBI::DatabaseError => e
   puts "An error occurred"
   puts "Error code:    #{e.err}"
   puts "Error message: #{e.errstr}"
   dbh.rollback
ensure
   # disconnect from server
   dbh.disconnect if dbh
end

Bir seferde birden fazla INSERT varsa, o zaman önce bir ifade hazırlamak ve sonra bunu bir döngü içinde birden çok kez yürütmek, döngü boyunca her seferinde çağırmaktan daha etkilidir.

OKUMA İşlemi

Herhangi bir veritabanı üzerinde OKUMA İşlemi, veritabanından bazı yararlı bilgileri almak anlamına gelir.

Veritabanı bağlantımız kurulduktan sonra, bu veritabanına bir sorgulama yapmaya hazırız. İkisini de kullanabilirizdo yöntem veya prepare ve execute bir veritabanı tablosundan değerleri getirme yöntemleri.

Kayıt getirme aşağıdaki adımları gerçekleştirir -

  • Gerekli koşullara göre SQL sorgusu hazırlamak. Bu, kullanılarak yapılacaktır.prepare yöntem.

  • Veritabanından tüm sonuçları seçmek için SQL sorgusunun yürütülmesi. Bu, kullanılarak yapılacaktır.execute yöntem.

  • Tüm sonuçları tek tek almak ve bu sonuçları yazdırmak. Bu, kullanılarak yapılacaktır.fetch yöntem.

  • Serbest bırakma İfadesi tutamacı. Bu, kullanılarak yapılacaktır.finish yöntem.

1000'den fazla maaşı olan EMPLOYEE tablosundaki tüm kayıtları sorgulama prosedürü aşağıdadır.

#!/usr/bin/ruby -w

require "dbi"

begin
   # connect to the MySQL server
   dbh = DBI.connect("DBI:Mysql:TESTDB:localhost", "testuser", "test123")
   sth = dbh.prepare("SELECT * FROM EMPLOYEE WHERE INCOME > ?")
   sth.execute(1000)

   sth.fetch do |row|
   printf "First Name: %s, Last Name : %s\n", row[0], row[1]
   printf "Age: %d, Sex : %s\n", row[2], row[3]
   printf "Salary :%d \n\n", row[4]
end
   sth.finish
rescue DBI::DatabaseError => e
   puts "An error occurred"
   puts "Error code:    #{e.err}"
   puts "Error message: #{e.errstr}"
ensure
   # disconnect from server
   dbh.disconnect if dbh
end

Bu, aşağıdaki sonucu verecektir -

First Name: Mac, Last Name : Mohan
Age: 20, Sex : M
Salary :2000

First Name: John, Last Name : Poul
Age: 25, Sex : M
Salary :2300

Veritabanından kayıt almak için daha fazla kısa yol yöntemi vardır. Eğer ilgileniyorsanız , Sonucu Getirme bölümüne gidin, aksi takdirde sonraki bölüme geçin.

Güncelleme İşlemi

GÜNCELLEME Herhangi bir veritabanı üzerinde işlem, veritabanında zaten mevcut olan bir veya daha fazla kaydı güncellemek anlamına gelir. Aşağıda, SEX olan tüm kayıtları 'M' olarak güncelleme prosedürü yer almaktadır. Burada tüm erkeklerin YAŞ'ını bir yıl artıracağız. Bu üç adım atacak -

  • Gerekli koşullara göre SQL sorgusu hazırlamak. Bu, kullanılarak yapılacaktır.prepare yöntem.

  • Veritabanından tüm sonuçları seçmek için SQL sorgusunun yürütülmesi. Bu, kullanılarak yapılacaktır.execute yöntem.

  • Serbest bırakma İfadesi tutamacı. Bu, kullanılarak yapılacaktır.finish yöntem.

  • Her şey yolunda giderse o zaman commit bu işlem yoksa yapabilirsin rollback tam işlem.

#!/usr/bin/ruby -w

require "dbi"

begin
   # connect to the MySQL server
   dbh = DBI.connect("DBI:Mysql:TESTDB:localhost", "testuser", "test123")
   sth = dbh.prepare("UPDATE EMPLOYEE SET AGE = AGE + 1 WHERE SEX = ?")
   sth.execute('M')
   sth.finish
   dbh.commit
rescue DBI::DatabaseError => e
   puts "An error occurred"
   puts "Error code:    #{e.err}"
   puts "Error message: #{e.errstr}"
   dbh.rollback
ensure
   # disconnect from server
   dbh.disconnect if dbh
end

DELETE İşlemi

Veritabanınızdan bazı kayıtları silmek istediğinizde DELETE işlemi gereklidir. Aşağıda, AGE'nin 20'den fazla olduğu ÇALIŞAN'dan tüm kayıtları silme prosedürü verilmiştir. Bu işlem aşağıdaki adımları gerçekleştirecektir.

  • Gerekli koşullara göre SQL sorgusu hazırlamak. Bu, kullanılarak yapılacaktır.prepare yöntem.

  • Veritabanından gerekli kayıtları silmek için SQL sorgusunun yürütülmesi. Bu, kullanılarak yapılacaktır.execute yöntem.

  • Serbest bırakma İfadesi tutamacı. Bu, kullanılarak yapılacaktır.finish yöntem.

  • Her şey yolunda giderse o zaman commit bu işlem yoksa yapabilirsin rollback tam işlem.

#!/usr/bin/ruby -w

require "dbi"

begin
   # connect to the MySQL server
   dbh = DBI.connect("DBI:Mysql:TESTDB:localhost", "testuser", "test123")
   sth = dbh.prepare("DELETE FROM EMPLOYEE WHERE AGE > ?")
   sth.execute(20)
   sth.finish
   dbh.commit
rescue DBI::DatabaseError => e
   puts "An error occurred"
   puts "Error code:    #{e.err}"
   puts "Error message: #{e.errstr}"
   dbh.rollback
ensure
   # disconnect from server
   dbh.disconnect if dbh
end

İşlemlerin Gerçekleştirilmesi

İşlemler, veri tutarlılığını sağlayan bir mekanizmadır. İşlemler aşağıdaki dört özelliğe sahip olmalıdır -

  • Atomicity - Ya bir işlem tamamlanır ya da hiçbir şey olmaz.

  • Consistency - Bir işlem tutarlı bir durumda başlamalı ve sistemi tutarlı bir durumda bırakmalıdır.

  • Isolation - Bir işlemin ara sonuçları cari işlemin dışında görünmez.

  • Durability - Bir işlem yapıldığında, sistem hatasından sonra bile etkiler kalıcıdır.

DBI birine iki yöntem sağlar işlemek veya geri alma işlem. İşlemleri uygulamak için kullanılabilecek işlem adında bir yöntem daha vardır . İşlemleri uygulamak için iki basit yaklaşım vardır -

Yaklaşım I

İlk yaklaşım , işlemi açıkça taahhüt etmek veya iptal etmek için DBI'nın kesinleştirme ve geri alma yöntemlerini kullanır -

dbh['AutoCommit'] = false # Set auto commit to false.
begin
   dbh.do("UPDATE EMPLOYEE SET AGE = AGE+1 WHERE FIRST_NAME = 'John'")
   dbh.do("UPDATE EMPLOYEE SET AGE = AGE+1 WHERE FIRST_NAME = 'Zara'")
   dbh.commit
rescue
   puts "transaction failed"
   dbh.rollback
end
dbh['AutoCommit'] = true

Yaklaşım II

İkinci yaklaşım işlem yöntemini kullanır . Bu daha basittir, çünkü işlemi oluşturan ifadeleri içeren bir kod bloğu alır. İşlem yöntemi, daha sonra başlatır, blok yürütür işlemek veya geri alma bloğu başarılı veya başarısız olmasına bağlı olarak, otomatik olarak -

dbh['AutoCommit'] = false # Set auto commit to false.
dbh.transaction do |dbh|
   dbh.do("UPDATE EMPLOYEE SET AGE = AGE+1 WHERE FIRST_NAME = 'John'")
   dbh.do("UPDATE EMPLOYEE SET AGE = AGE+1 WHERE FIRST_NAME = 'Zara'")
end
dbh['AutoCommit'] = true

COMMIT İşlemi

Commit, değişikliklerin sonuçlandırılması için veritabanına yeşil sinyal veren ve bu işlemden sonra hiçbir değişiklik geri alınamayan işlemdir.

İşte aranacak basit bir örnek commit yöntem.

dbh.commit

GERİ DÖNME İşlemi

Değişikliklerden bir veya daha fazlasından memnun değilseniz ve bu değişiklikleri tamamen geri almak istiyorsanız, o zaman rollback yöntem.

İşte aranacak basit bir örnek rollback yöntem.

dbh.rollback

Veritabanının Bağlantısını Kesme

Veritabanı bağlantısını kesmek için bağlantı kesme API'sini kullanın.

dbh.disconnect

Bir veritabanına bağlantı, kullanıcı tarafından bağlantıyı kesme yöntemiyle kapatılırsa, bekleyen tüm işlemler DBI tarafından geri alınır. Bununla birlikte, herhangi bir DBI uygulama detayına bağlı kalmak yerine, uygulamanız kesin olarak commit veya geri alma çağrısı yapmaktan daha iyi olacaktır.

Hataları Yönetme

Birçok hata kaynağı var. Birkaç örnek, yürütülen bir SQL deyimindeki sözdizimi hatası, bir bağlantı hatası veya önceden iptal edilmiş veya bitmiş bir ifade tutamacı için getirme yönteminin çağrılmasıdır.

Bir DBI yöntemi başarısız olursa, DBI bir istisna oluşturur. DBI yöntemleri birkaç istisna türünden herhangi birini ortaya çıkarabilir, ancak en önemli iki istisna sınıfı DBI :: InterfaceError ve DBI :: DatabaseError'dır .

Bu sınıfların istisna nesneleri , hata numarasını, açıklayıcı bir hata dizesini ve standart bir hata kodunu temsil eden err , errstr ve state adlı üç niteliğe sahiptir . Nitelikler aşağıda açıklanmıştır -

  • err- DBD tarafından desteklenmiyorsa oluşan hatanın tamsayı gösterimini veya sıfır döndürür. Oracle DBD, ORA-XXXX hata mesajının sayısal bölümünü döndürür .

  • errstr - Oluşan hatanın dize gösterimini döndürür.

  • state- Oluşan hatanın SQLSTATE kodunu döndürür. SQLSTATE beş karakter uzunluğunda bir dizedir. Çoğu DBD bunu desteklemez ve bunun yerine sıfır döndürür.

Örneklerin çoğunda yukarıdaki kodu gördünüz -

rescue DBI::DatabaseError => e
   puts "An error occurred"
   puts "Error code:    #{e.err}"
   puts "Error message: #{e.errstr}"
   dbh.rollback
ensure
   # disconnect from server
   dbh.disconnect if dbh
end

Komut dosyanızın çalışırken ne yaptığı hakkında hata ayıklama bilgisi almak için izlemeyi etkinleştirebilirsiniz. Bunu yapmak için, öncelikle dbi / iz modülü yüklemek ve daha sonra çağırmalıdır iz yöntemi olduğunu kontrolleri iz modu ve çıkış hedef -

require "dbi/trace"
..............

trace(mode, destination)

Mod değeri 0 (kapalı), 1, 2 veya 3 olabilir ve hedef bir GÇ nesnesi olmalıdır. Varsayılan değerler sırasıyla 2 ve STDERR'dir.

Yöntemlerle Kod Blokları

Tutamaç oluşturan bazı yöntemler vardır. Bu yöntemler bir kod bloğu ile çağrılabilir. Kod bloğunu yöntemlerle birlikte kullanmanın avantajı, kod bloğuna bir parametre olarak tutamacı sağlaması ve blok sona erdiğinde tutamacı otomatik olarak temizlemesidir. Kavramı anlamak için birkaç örnek var.

  • DBI.connect- Bu yöntem bir veritabanı tanıtıcısı oluşturur ve veritabanının bağlantısını kesmek için bloğun sonunda bağlantıyı kesmenin çağrılması önerilir .

  • dbh.prepare- Bu yöntem bir ifade tutamacı oluşturur ve bloğun sonunda bitirilmesi önerilir . Blok içinde, ifadeyi yürütmek için yürütme yöntemini çağırmalısınız .

  • dbh.execute- Bu yöntem benzerdir, ancak blok içinde çalıştırmayı çağırmamıza gerek yoktur. İfade tutamacı otomatik olarak yürütülür.

örnek 1

DBI.connect bir kod bloğu alabilir, veritabanı tutamacını ona iletebilir ve aşağıdaki gibi bloğun sonundaki tutamacı otomatik olarak keser.

dbh = DBI.connect("DBI:Mysql:TESTDB:localhost", "testuser", "test123") do |dbh|

Örnek 2

dbh.prepare bir kod bloğu alabilir, deyim tutamacını ona aktarır ve çağrılar otomatik olarak bloğun sonunda aşağıdaki gibi bitirilir.

dbh.prepare("SHOW DATABASES") do |sth|
   sth.execute
   puts "Databases: " + sth.fetch_all.join(", ")
end

Örnek 3

dbh.execute bir kod bloğu alabilir, ifade tutamacını ona iletebilir ve çağrılar otomatik olarak bloğun sonunda aşağıdaki şekilde biter -

dbh.execute("SHOW DATABASES") do |sth|
   puts "Databases: " + sth.fetch_all.join(", ")
end

DBI işlem yöntemi ayrıca yukarıda açıklanan bir kod bloğunu alır.

Sürücüye Özgü İşlevler ve Nitelikler

DBI, veritabanı sürücülerinin , herhangi bir Tutamaç nesnesinin func yöntemi aracılığıyla kullanıcı tarafından çağrılabilen, veritabanına özgü ek işlevler sağlamasına izin verir .

Sürücüye özgü öznitelikler desteklenir ve aşağıdakiler kullanılarak ayarlanabilir veya alınabilir: []= veya [] yöntemler.

Sr.No. Fonksiyonlar ve Açıklama
1

dbh.func(:createdb, db_name)

Yeni bir veritabanı oluşturur.

2

dbh.func(:dropdb, db_name)

Bir veritabanı bırakır.

3

dbh.func(:reload)

Yeniden yükleme işlemi gerçekleştirir.

4

dbh.func(:shutdown)

Sunucuyu kapatır.

5

dbh.func(:insert_id) => Fixnum

Bir bağlantı için en son AUTO_INCREMENT değerini döndürür.

6

dbh.func(:client_info) => String

MySQL istemci bilgilerini sürüm açısından döndürür.

7

dbh.func(:client_version) => Fixnum

Müşteri bilgilerini sürüm açısından döndürür. Bu şuna benzer: client_info, ancak sting yerine bir fixnum döndürür.

8

dbh.func(:host_info) => String

Ana bilgisayar bilgilerini döndürür.

9

dbh.func(:proto_info) => Fixnum

İletişim için kullanılan protokolü döndürür.

10

dbh.func(:server_info) => String

MySQL sunucu bilgilerini sürüm açısından döndürür.

11

dbh.func(:stat) => String

Veritabanının mevcut durumunu döndürür.

12

dbh.func(:thread_id) => Fixnum

Mevcut iş parçacığı kimliğini döndürür.

Misal

#!/usr/bin/ruby

require "dbi"
begin
   # connect to the MySQL server
   dbh = DBI.connect("DBI:Mysql:TESTDB:localhost", "testuser", "test123") 
   puts dbh.func(:client_info)
   puts dbh.func(:client_version)
   puts dbh.func(:host_info)
   puts dbh.func(:proto_info)
   puts dbh.func(:server_info)
   puts dbh.func(:thread_id)
   puts dbh.func(:stat)
rescue DBI::DatabaseError => e
   puts "An error occurred"
   puts "Error code:    #{e.err}"
   puts "Error message: #{e.errstr}"
ensure
   dbh.disconnect if dbh
end

Bu, aşağıdaki sonucu verecektir -

5.0.45
50045
Localhost via UNIX socket
10
5.0.45
150621
Uptime: 384981  Threads: 1  Questions: 1101078  Slow queries: 4 \
Opens: 324  Flush tables: 1  Open tables: 64  \
Queries per second avg: 2.860

Ruby genel amaçlı bir dildir; düzgün bir şekilde web dili olarak adlandırılamaz . Yine de, genel olarak web uygulamaları ve web araçları Ruby'nin en yaygın kullanımları arasındadır.

Ruby'de yalnızca kendi SMTP sunucunuzu, FTP arka plan programınızı veya Web sunucunuzu yazmakla kalmaz, aynı zamanda Ruby'yi CGI programlama veya PHP'nin yerine geçme gibi daha genel görevler için de kullanabilirsiniz.

CGI Programlama hakkında daha fazla ayrıntı için lütfen CGI Programlama Eğitimi ile birkaç dakika geçirin .

CGI Komut Dosyaları Yazma

En basit Ruby CGI betiği şuna benzer -

#!/usr/bin/ruby

puts "HTTP/1.0 200 OK"
puts "Content-type: text/html\n\n"
puts "<html><body>This is a test</body></html>"

Bu betiği test.cgi olarak adlandırırsanız ve doğru izinlere sahip Unix tabanlı bir Web barındırma sağlayıcısına yüklediyseniz, onu bir CGI betiği olarak kullanabilirsiniz.

Örneğin, Web siteniz varsa https://www.example.com/bir Linux Web barındırma sağlayıcısında barındırılır ve test.cgi'yi ana dizine yükler ve yürütme izinleri verirsiniz, ardından ziyaret edinhttps://www.example.com/test.cgi yazan bir HTML sayfası döndürmelidir This is a test.

Burada bir Web tarayıcısından test.cgi istendiğinde, Web sunucusu Web sitesinde test.cgi'yi arar ve ardından bunu Ruby yorumlayıcısını kullanarak yürütür. Ruby betiği, temel bir HTTP başlığı döndürür ve ardından temel bir HTML belgesi döndürür.

Cgi.rb kullanma

Ruby, adında özel bir kitaplıkla birlikte gelir cgi bu, önceki CGI betiği ile olanlardan daha karmaşık etkileşimler sağlar.

Cgi kullanan temel bir CGI betiği oluşturalım -

#!/usr/bin/ruby

require 'cgi'
cgi = CGI.new

puts cgi.header
puts "<html><body>This is a test</body></html>"

Burada bir CGI nesnesi oluşturdunuz ve bunu sizin için başlık satırını yazdırmak için kullandınız.

Form İşleme

CGI sınıfını kullanmak, HTML sorgu parametrelerine iki şekilde erişmenizi sağlar. Bize /cgi-bin/test.cgi?FirstName = Zara & LastName = Ali'nin bir URL'sinin verildiğini varsayalım.

FirstName ve LastName parametrelerine CGI # [] kullanarak aşağıdaki gibi doğrudan erişebilirsiniz -

#!/usr/bin/ruby

require 'cgi'
cgi = CGI.new
cgi['FirstName'] # =>  ["Zara"]
cgi['LastName']  # =>  ["Ali"]

Bu form değişkenlerine erişmenin başka bir yolu var. Bu kod size tüm anahtar ve değerlerin bir karmasını verecektir -

#!/usr/bin/ruby

require 'cgi'
cgi = CGI.new
h = cgi.params  # =>  {"FirstName"=>["Zara"],"LastName"=>["Ali"]}
h['FirstName']  # =>  ["Zara"]
h['LastName']   # =>  ["Ali"]

Tüm anahtarları almak için kod aşağıdadır -

#!/usr/bin/ruby

require 'cgi'
cgi = CGI.new
cgi.keys         # =>  ["FirstName", "LastName"]

Bir form aynı ada sahip birden çok alan içeriyorsa, karşılık gelen değerler koda bir dizi olarak döndürülür. [] Erişimcisi, hepsini almak için these.index'in yalnızca ilkini params yönteminin sonucunu döndürür.

Bu örnekte, formda "ad" adlı üç alan olduğunu ve "Zara", "Huma" ve "Nuha" adlı üç ad girdiğimizi varsayalım -

#!/usr/bin/ruby

require 'cgi'
cgi = CGI.new
cgi['name']        # => "Zara"
cgi.params['name'] # => ["Zara", "Huma", "Nuha"]
cgi.keys           # => ["name"]
cgi.params         # => {"name"=>["Zara", "Huma", "Nuha"]}

NoteRuby, GET ve POST yöntemleriyle otomatik olarak ilgilenecektir. Bu iki farklı yöntemin ayrı bir tedavisi yoktur.

Doğru verileri gönderebilen ilişkili, ancak temel bir form, şu şekilde HTML koduna sahip olacaktır:

<html>
   <body>
      <form method = "POST" action = "http://www.example.com/test.cgi">
         First Name :<input type = "text" name = "FirstName" value = "" />
         <br />
         Last Name :<input type = "text" name = "LastName" value = "" /> 
         <input type = "submit" value = "Submit Data" />
      </form>
   </body>
</html>

Formlar ve HTML Oluşturma

CGI, HTML oluşturmak için kullanılan çok sayıda yöntem içerir. Etiket başına bir yöntem bulacaksınız. Bu yöntemleri etkinleştirmek için, CGI.new'i çağırarak bir CGI nesnesi oluşturmanız gerekir.

Etiket yerleştirmeyi kolaylaştırmak için, bu yöntemler içeriklerini kod blokları olarak alır. Kod blokları , etiketin içeriği olarak kullanılacak bir Dize döndürmelidir . Örneğin -

#!/usr/bin/ruby

require "cgi"
cgi = CGI.new("html4")
cgi.out {
   cgi.html {
      cgi.head { "\n"+cgi.title{"This Is a Test"} } +
      cgi.body { "\n"+
         cgi.form {"\n"+
            cgi.hr +
            cgi.h1 { "A Form: " } + "\n"+
            cgi.textarea("get_text") +"\n"+
            cgi.br +
            cgi.submit
         }
      }
   }
}

NOTE- CGI sınıfının form yöntemi, form gönderimi sırasında kullanılacak HTTP yöntemini (GET, POST, vb.) Ayarlayacak bir yöntem parametresini kabul edebilir. Bu örnekte kullanılan varsayılan POST'tur.

Bu, aşağıdaki sonucu verecektir -

Content-Type: text/html
Content-Length: 302

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Final//EN">

<HTML>
   <HEAD>
      <TITLE>This Is a Test</TITLE>
   </HEAD>
   <BODY>
      <FORM METHOD = "post" ENCTYPE = "application/x-www-form-urlencoded">
         <HR>
         <H1>A Form: </H1>
         <TEXTAREA COLS = "70" NAME = "get_text" ROWS = "10"></TEXTAREA>
         <BR>
         <INPUT TYPE = "submit">
      </FORM>
   </BODY>
</HTML>

Dizeleri Alıntılamak

URL'ler ve HTML kodu ile uğraşırken, belirli karakterleri alıntılamaya dikkat etmelisiniz. Örneğin, eğik çizgi karakteri (/) bir URL'de özel bir anlama sahiptir, bu nedenleescaped yol adının bir parçası değilse.

Örneğin, URL’nin sorgu kısmındaki herhangi bir /,% 2F dizesine çevrilir ve kullanmanız için /’ye geri çevrilmesi gerekir. Boşluk ve ve işareti de özel karakterlerdir. Bunu halletmek için, CGI rutinleri sağlarCGI.escape ve CGI.unescape.

#!/usr/bin/ruby

require 'cgi'
puts CGI.escape(Zara Ali/A Sweet & Sour Girl")

Bu, aşağıdaki sonucu verecektir -

Zara+Ali%2FA Sweet+%26+Sour+Girl")

#!/usr/bin/ruby

require 'cgi'
puts CGI.escapeHTML('<h1>Zara Ali/A Sweet & Sour Girl</h1>')

Bu, aşağıdaki sonucu verecektir -

&lt;h1&gt;Zara Ali/A Sweet & Sour Girl&lt;/h1&gt;'

CGI Sınıfında Kullanışlı Yöntemler

İşte CGI sınıfıyla ilgili yöntemlerin listesi -

  • Yakut CGI - Standart CGI kütüphaneye ilişkin yöntemler.

Çerezler ve Oturumlar

Bu iki kavramı farklı bölümlerde açıkladık. Lütfen bölümleri takip edin -

  • Yakut CGI Çerezler - CGI Çerezler nasıl baş edilir.

  • Yakut CGI Sessions - CGI oturumları yönetmek için.

Web Hosting Sunucuları

Web sitenizi Unix tabanlı bir Sunucuda barındırmak için internette aşağıdaki konuyu kontrol edebilirsiniz -

  • Unix tabanlı web barındırma

Basit Posta Aktarım Protokolü (SMTP), e-posta göndermeyi ve posta sunucuları arasında e-posta yönlendirmeyi işleyen bir protokoldür.

Ruby, Basit Posta Aktarım Protokolü (SMTP) istemci tarafı bağlantısı için Net :: SMTP sınıfı sağlar ve yeni ve başlangıç ​​olmak üzere iki sınıf yöntemi sağlar .

  • new iki parametre alır -

    • Varsayılan olarak localhost olan sunucu adı .

    • Bağlantı noktası numarası, varsayılan olarak iyi bilinen bağlantı noktası 25'e ayarlanır.

  • start yöntem bu parametreleri alır -

    • Sunucu - SMTP sunucusunun IP adı, localhost'a varsaymak.

    • Bağlantı noktası - Bağlantı noktası numarası, varsayılan olarak 25'tir.

    • Domain ENV [ "HOSTNAME"] varsaymak posta gönderen Alan, -.

    • Hesap - Kullanıcı adı, varsayılan sıfırdır.

    • Şifre - Kullanıcı parolası, nil varsaymak.

    • Authtype - Yetkilendirme tipi, varsaymak cram_md5 .

Bir SMTP nesnesinin, genellikle bir iletiyi postalama işini yapmak için kullanılan sendmail adlı bir örnek yöntemi vardır. Üç parametre alır -

  • Kaynak - Bir ile bir dize veya dizi ya da bir şey her yineleyici bir seferde bir dize dönen.

  • Gönderici - görünecektir bir dize gelen e-postanın alanında.

  • Alıcıları - bir dize veya alıcıların muhatap (ler) i temsil eden şeritlerinin bir dizi.

Misal

Ruby komut dosyasını kullanarak bir e-posta göndermenin basit bir yolu. Bir kez deneyin -

require 'net/smtp'

message = <<MESSAGE_END
From: Private Person <[email protected]>
To: A Test User <[email protected]>
Subject: SMTP e-mail test

This is a test e-mail message.
MESSAGE_END

Net::SMTP.start('localhost') do |smtp|
  smtp.send_message message, '[email protected]', '[email protected]'
end

Burada, başlıkları doğru şekilde biçimlendirmeye dikkat ederek, bir belge kullanarak mesaja temel bir e-posta yerleştirdiniz. E-postalar için birFrom, To, ve Subject e-postanın gövdesinden boş bir satırla ayrılmış başlık.

Postayı göndermek için, yerel makinedeki SMTP sunucusuna bağlanmak için Net :: SMTP'yi kullanın ve ardından parametre olarak mesaj, gönderen adresi ve hedef adresi ile birlikte send_message yöntemini kullanın (gönderen ve gönderen adresleri e-postanın içinde, bunlar her zaman postayı yönlendirmek için kullanılmaz).

Makinenizde bir SMTP sunucusu çalıştırmıyorsanız, uzak bir SMTP sunucusuyla iletişim kurmak için Net :: SMTP'yi kullanabilirsiniz. Bir web posta hizmeti (Hotmail veya Yahoo! Mail gibi) kullanmadığınız sürece, e-posta sağlayıcınız size aşağıdaki gibi Net :: SMTP'ye sağlayabileceğiniz giden posta sunucusu ayrıntılarını sağlayacaktır -

Net::SMTP.start('mail.your-domain.com')

Bu kod satırı, herhangi bir kullanıcı adı veya parola kullanmadan mail.alanınız.com'un 25 numaralı bağlantı noktasındaki SMTP sunucusuna bağlanır. Gerekirse, bağlantı noktası numarasını ve diğer ayrıntıları belirtebilirsiniz. Örneğin -

Net::SMTP.start('mail.your-domain.com', 
                25, 
                'localhost', 
                'username', 'password' :plain)

Bu örnek, düz metin biçiminde bir kullanıcı adı ve parola kullanarak mail.alanınız.com adresindeki SMTP sunucusuna bağlanır. İstemcinin ana bilgisayar adını localhost olarak tanımlar.

Ruby kullanarak bir HTML e-postası gönderme

Ruby kullanarak bir metin mesajı gönderdiğinizde, tüm içerik basit metin olarak değerlendirilecektir. Metin mesajına HTML etiketleri ekleseniz bile, basit metin olarak görüntülenecek ve HTML etiketleri HTML sözdizimine göre biçimlendirilmeyecektir. Ancak Ruby Net :: SMTP, bir HTML mesajını gerçek HTML mesajı olarak gönderme seçeneği sunar.

Bir e-posta mesajı gönderirken, bir HTML e-postası göndermek için bir Mime sürümü, içerik türü ve karakter seti belirleyebilirsiniz.

Misal

Aşağıda, HTML içeriğini e-posta olarak gönderme örneği verilmiştir. Bir kez deneyin -

require 'net/smtp'

message = <<MESSAGE_END
From: Private Person <[email protected]>
To: A Test User <[email protected]>
MIME-Version: 1.0
Content-type: text/html
Subject: SMTP e-mail test

This is an e-mail message to be sent in HTML format

<b>This is HTML message.</b>
<h1>This is headline.</h1>
MESSAGE_END

Net::SMTP.start('localhost') do |smtp|
   smtp.send_message message, '[email protected]', '[email protected]'
end

Ekleri e-posta olarak gönderme

Karışık içerikli bir e-posta göndermek için şunu ayarlamanız gerekir: Content-type başlık multipart/mixed. Ardından metin ve ek bölümleri içinde belirtilebilirboundaries.

E-postanın mesaj bölümünde görünemeyen, iki tire ve ardından benzersiz bir sayı ile bir sınır başlatılır. E-postanın son bölümünü belirten son sınır da iki kısa çizgiyle bitmelidir.

Ekli dosyalar şu şekilde kodlanmalıdır: pack("m") iletimden önce base64 kodlamasına sahip olmak için işlev.

Misal

Bir dosya gönderecek örnek aşağıdadır /tmp/test.txt ek olarak.

require 'net/smtp'

filename = "/tmp/test.txt"
# Read a file and encode it into base64 format
filecontent = File.read(filename)
encodedcontent = [filecontent].pack("m")   # base64

marker = "AUNIQUEMARKER"
body = <<EOF
This is a test email to send an attachement.
EOF

# Define the main headers.
part1 = <<EOF
From: Private Person <[email protected]>
To: A Test User <[email protected]>
Subject: Sending Attachement
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary = #{marker}
--#{marker}
EOF

# Define the message action
part2 = <<EOF
Content-Type: text/plain
Content-Transfer-Encoding:8bit

#{body}
--#{marker}
EOF

# Define the attachment section
part3 = <<EOF
Content-Type: multipart/mixed; name = \"#{filename}\"
Content-Transfer-Encoding:base64
Content-Disposition: attachment; filename = "#{filename}"

#{encodedcontent}
--#{marker}--
EOF

mailtext = part1 + part2 + part3

# Let's put our code in safe area
begin 
   Net::SMTP.start('localhost') do |smtp|
      smtp.sendmail(mailtext, '[email protected]', ['[email protected]'])
   end
rescue Exception => e  
   print "Exception occured: " + e  
end

NOTE - Dizi içinde birden çok hedef belirtebilirsiniz, ancak bunlar virgülle ayrılmalıdır.

Ruby, ağ hizmetlerine iki düzeyde erişim sağlar. Düşük bir düzeyde, hem bağlantı odaklı hem de bağlantısız protokoller için istemcileri ve sunucuları uygulamanıza olanak tanıyan temeldeki işletim sistemindeki temel yuva desteğine erişebilirsiniz.

Ruby ayrıca FTP, HTTP vb. Gibi belirli uygulama düzeyindeki ağ protokollerine daha yüksek düzeyde erişim sağlayan kitaplıklara sahiptir.

Bu bölüm size Ağ Oluşturma - Soket Programlama'daki en ünlü kavram hakkında bir fikir verecektir.

Soketler nedir?

Soketler, çift yönlü bir iletişim kanalının uç noktalarıdır. Soketler bir işlem içinde, aynı makinedeki işlemler arasında veya farklı kıtalardaki işlemler arasında iletişim kurabilir.

Soketler, bir dizi farklı kanal türü üzerinden uygulanabilir: Unix etki alanı soketleri, TCP, UDP, vb. Soket ortak taşımaları yanı sıra dinlenme işlemek için genel bir arayüz işlemek için belirli sınıfları sağlar.

Soketlerin kendi kelime dağarcığı vardır -

Sr.No. Terim ve Açıklama
1

domain

Taşıma mekanizması olarak kullanılacak protokol ailesi. Bu değerler, PF_INET, PF_UNIX, PF_X25 ve benzeri gibi sabitlerdir.

2

type

İki uç nokta arasındaki iletişim türü, tipik olarak bağlantı odaklı protokoller için SOCK_STREAM ve bağlantısız protokoller için SOCK_DGRAM.

3

protocol

Tipik olarak sıfır, bu, bir alan ve tür içindeki bir protokolün bir varyantını tanımlamak için kullanılabilir.

4

hostname

Bir ağ arayüzünün tanımlayıcısı -

Bir ana bilgisayar adı, noktalı dörtlü bir adres veya iki nokta üst üste (ve muhtemelen nokta) gösteriminde bir IPV6 adresi olabilen bir dize

Bir INADDR_BROADCAST adresini belirten bir "<broadcast>" dizesi.

INADDR_ANY'yi belirten sıfır uzunluklu bir dize veya

Ana bilgisayar bayt sırasına göre ikili adres olarak yorumlanan bir Tamsayı.

5

port

Her sunucu, bir veya daha fazla bağlantı noktasını arayan istemcileri dinler. Bir bağlantı noktası, bir Fixnum bağlantı noktası numarası, bir bağlantı noktası numarası içeren bir dize veya bir hizmetin adı olabilir.

Basit Bir Müşteri

Burada, belirli bir bağlantı noktasına ve verilen ana bilgisayara bağlantı açacak çok basit bir istemci programı yazacağız. Ruby sınıfıTCPSocketböyle bir soketi açmak için açık fonksiyon sağlar .

TCPSocket.open(hosname, port )TCP bağlantısı açar hostname üzerinde port .

Bir soket açtıktan sonra, herhangi bir IO nesnesi gibi okuyabilirsiniz. Bittiğinde, bir dosyayı kapatacağınız için onu kapatmayı unutmayın.

Aşağıdaki kod, belirli bir ana bilgisayara ve bağlantı noktasına bağlanan, soketten mevcut verileri okuyan ve ardından çıkan çok basit bir istemcidir -

require 'socket'        # Sockets are in standard library

hostname = 'localhost'
port = 2000

s = TCPSocket.open(hostname, port)

while line = s.gets     # Read lines from the socket
   puts line.chop       # And print with platform line terminator
end
s.close                 # Close the socket when done

Basit Bir Sunucu

İnternet sunucularını yazmak için, TCPServersınıf. Bir TCPServer nesnesi, TCPSocket nesneleri için bir fabrikadır.

Şimdi ara TCPServer.open(hostname, porthizmetiniz için bir bağlantı noktası belirleme ve birTCPServer nesne.

Ardından, döndürülen TCPServer nesnesinin kabul yöntemini çağırın. Bu yöntem, bir istemci belirttiğiniz bağlantı noktasına bağlanıncaya kadar bekler ve ardından bu istemciye bağlantıyı temsil eden bir TCPSocket nesnesi döndürür .

require 'socket'                 # Get sockets from stdlib

server = TCPServer.open(2000)    # Socket to listen on port 2000
loop {                           # Servers run forever
   client = server.accept        # Wait for a client to connect
   client.puts(Time.now.ctime)   # Send the time to the client
   client.puts "Closing the connection. Bye!"
   client.close                  # Disconnect from the client
}

Şimdi, bu sunucuyu arka planda çalıştırın ve ardından sonucu görmek için yukarıdaki istemciyi çalıştırın.

Çok İstemcili TCP Sunucuları

İnternetteki çoğu sunucu, herhangi bir zamanda çok sayıda istemciyle ilgilenecek şekilde tasarlanmıştır.

Ruby'nin Thread sınıfı, istekleri kabul eden ve ana programın daha fazla bağlantı beklemesine izin verirken bağlantıyı işlemek için hemen yeni bir yürütme dizisi oluşturan çok iş parçacıklı bir sunucu oluşturmayı kolaylaştırır.

require 'socket'                 # Get sockets from stdlib

server = TCPServer.open(2000)    # Socket to listen on port 2000
loop {                           # Servers run forever
   Thread.start(server.accept) do |client|
   client.puts(Time.now.ctime)   # Send the time to the client
   client.puts "Closing the connection. Bye!"
   client.close                  # Disconnect from the client
   end
}

Bu örnekte, kalıcı bir döngünüz var ve server.accept yanıt verdiğinde, iş parçacığına iletilen bağlantı nesnesini kullanarak yeni bir iş parçacığı oluşturulur ve yeni kabul edilen bağlantıyı işlemek için hemen başlatılır. Ancak, ana program hemen geri döner ve yeni bağlantılar bekler.

Ruby iş parçacığını bu şekilde kullanmak, kodun taşınabilir olduğu ve Linux, OS X ve Windows'ta aynı şekilde çalışacağı anlamına gelir.

Küçük Bir Web Tarayıcısı

Soket kitaplığını herhangi bir İnternet protokolünü uygulamak için kullanabiliriz. Burada, örneğin, bir web sayfasının içeriğini almak için bir kod var -

require 'socket'
 
host = 'www.tutorialspoint.com'     # The web server
port = 80                           # Default HTTP port
path = "/index.htm"                 # The file we want 

# This is the HTTP request we send to fetch a file
request = "GET #{path} HTTP/1.0\r\n\r\n"

socket = TCPSocket.open(host,port)  # Connect to server
socket.print(request)               # Send request
response = socket.read              # Read complete response
# Split response at first blank line into headers and body
headers,body = response.split("\r\n\r\n", 2) 
print body                          # And display it

Benzer web istemcisini uygulamak için önceden oluşturulmuş bir kitaplık kullanabilirsiniz. Net::HTTPHTTP ile çalışmak için. İşte önceki kodun eşdeğerini yapan kod -

require 'net/http'                  # The library we need
host = 'www.tutorialspoint.com'     # The web server
path = '/index.htm'                 # The file we want 

http = Net::HTTP.new(host)          # Create a connection
headers, body = http.get(path)      # Request the file
if headers.code == "200"            # Check the status code   
   print body                        
else                                
   puts "#{headers.code} #{headers.message}" 
end

Lütfen FTP, SMTP, POP ve IMAP protokolleriyle çalışmak için benzer kitaplıkları kontrol edin.

Diğer Okumalar

Size Soket Programlamaya hızlı bir başlangıç ​​yaptık. Bu büyük bir konudur, bu nedenle daha fazla ayrıntı bulmak için Ruby Soket Kitaplığı ve Sınıf Yöntemlerini incelemeniz önerilir .

XML nedir?

Genişletilebilir Biçimlendirme Dili (XML), HTML veya SGML'ye çok benzer bir biçimlendirme dilidir. Bu, World Wide Web Konsorsiyumu tarafından önerilir ve açık bir standart olarak mevcuttur.

XML, programcıların işletim sistemi ve / veya geliştirme dilinden bağımsız olarak diğer uygulamalar tarafından okunabilen uygulamalar geliştirmesine olanak tanıyan taşınabilir, açık kaynaklı bir dildir.

XML, SQL tabanlı bir omurga gerektirmeden küçük ila orta büyüklükteki verileri izlemek için son derece kullanışlıdır.

XML Ayrıştırıcı Mimarileri ve API'leri

XML ayrıştırıcılar için kullanılabilen iki farklı çeşit vardır -

  • SAX-like (Stream interfaces)- Burada, ilgili olaylar için geri aramaları kaydedersiniz ve ardından ayrıştırıcının belge boyunca ilerlemesine izin verirsiniz. Bu, belgeleriniz büyük olduğunda veya bellek sınırlamalarınız olduğunda kullanışlıdır, dosyayı diskten okurken ayrıştırır ve dosyanın tamamı hiçbir zaman bellekte depolanmaz.

  • DOM-like (Object tree interfaces) - Bu, tüm dosyanın belleğe okunduğu ve bir XML belgesinin tüm özelliklerini temsil etmek için hiyerarşik (ağaç tabanlı) bir biçimde depolandığı World Wide Web Consortium önerisidir.

SAX, büyük dosyalarla çalışırken DOM'un yapabildiği kadar hızlı bilgiyi işleyemez. Öte yandan, yalnızca DOM'u kullanmak, özellikle çok sayıda küçük dosyada kullanılıyorsa, kaynaklarınızı gerçekten öldürebilir.

SAX salt okunurdur, DOM ise XML dosyasında değişikliklere izin verir. Bu iki farklı API tam anlamıyla birbirini tamamladığından, her ikisini de büyük projelerde kullanamamanız için hiçbir neden yoktur.

Ruby Kullanarak XML Ayrıştırma ve Oluşturma

XML'i işlemenin en yaygın yolu Sean Russell'ın REXML kitaplığıdır. REXML 2002'den beri standart Ruby dağıtımının bir parçası olmuştur.

REXML, XML 1.0 standardına uygun saf bir Ruby XML işlemcisidir. Bu ise olmayan doğrulama OASIS olmayan doğrulama uyumluluk testleri her geçen işlemci.

REXML ayrıştırıcısı, diğer mevcut ayrıştırıcılara göre şu avantajlara sahiptir:

  • Ruby'de yüzde 100 yazılmıştır.
  • Hem SAX hem de DOM ayrıştırması için kullanılabilir.
  • Hafiftir, 2000 satırdan az koddur.
  • Yöntemler ve sınıflar gerçekten anlaşılması kolaydır.
  • SAX2 tabanlı API ve Tam XPath desteği.
  • Ruby kurulumuyla gönderilir ve ayrı bir kurulum gerekmez.

Tüm XML kodu örneklerimiz için, girdi olarak basit bir XML dosyası kullanalım -

<collection shelf = "New Arrivals">
   <movie title = "Enemy Behind">
      <type>War, Thriller</type>
      <format>DVD</format>
      <year>2003</year>
      <rating>PG</rating>
      <stars>10</stars>
      <description>Talk about a US-Japan war</description>
   </movie>
   <movie title = "Transformers">
      <type>Anime, Science Fiction</type>
      <format>DVD</format>
      <year>1989</year>
      <rating>R</rating>
      <stars>8</stars>
      <description>A schientific fiction</description>
   </movie>
   <movie title = "Trigun">
      <type>Anime, Action</type>
      <format>DVD</format>
      <episodes>4</episodes>
      <rating>PG</rating>
      <stars>10</stars>
      <description>Vash the Stampede!</description>
   </movie>
   <movie title = "Ishtar">
      <type>Comedy</type>
      <format>VHS</format>
      <rating>PG</rating>
      <stars>2</stars>
      <description>Viewable boredom</description>
   </movie>
</collection>

DOM benzeri Ayrıştırma

Öncelikle XML verilerimizi ağaç tarzında ayrıştıralım . İsteyerek başlıyoruzrexml/documentkütüphane; genellikle kolaylık sağlamak için üst düzey ad alanına içe aktarmak için bir REXML dahil ederiz.

#!/usr/bin/ruby -w

require 'rexml/document'
include REXML

xmlfile = File.new("movies.xml")
xmldoc = Document.new(xmlfile)

# Now get the root element
root = xmldoc.root
puts "Root element : " + root.attributes["shelf"]

# This will output all the movie titles.
xmldoc.elements.each("collection/movie"){ 
   |e| puts "Movie Title : " + e.attributes["title"] 
}

# This will output all the movie types.
xmldoc.elements.each("collection/movie/type") {
   |e| puts "Movie Type : " + e.text 
}

# This will output all the movie description.
xmldoc.elements.each("collection/movie/description") {
   |e| puts "Movie Description : " + e.text 
}

Bu, aşağıdaki sonucu verecektir -

Root element : New Arrivals
Movie Title : Enemy Behind
Movie Title : Transformers
Movie Title : Trigun
Movie Title : Ishtar
Movie Type : War, Thriller
Movie Type : Anime, Science Fiction
Movie Type : Anime, Action
Movie Type : Comedy
Movie Description : Talk about a US-Japan war
Movie Description : A schientific fiction
Movie Description : Vash the Stampede!
Movie Description : Viewable boredom

SAX benzeri Ayrıştırma

Aynı verileri, movies.xml dosyasını, akış odaklı bir şekilde işlemek için , yöntemleri ayrıştırıcıdan gelen geri aramaların hedefi olacak bir dinleyici sınıfı tanımlayacağız .

NOTE - Küçük bir dosya için SAX benzeri ayrıştırmanın kullanılması önerilmez, bu sadece bir demo örneği içindir.

#!/usr/bin/ruby -w

require 'rexml/document'
require 'rexml/streamlistener'
include REXML

class MyListener
   include REXML::StreamListener
   def tag_start(*args)
      puts "tag_start: #{args.map {|x| x.inspect}.join(', ')}"
   end

   def text(data)
      return if data =~ /^\w*$/     # whitespace only
      abbrev = data[0..40] + (data.length > 40 ? "..." : "")
      puts "  text   :   #{abbrev.inspect}"
   end
end

list = MyListener.new
xmlfile = File.new("movies.xml")
Document.parse_stream(xmlfile, list)

Bu, aşağıdaki sonucu verecektir -

tag_start: "collection", {"shelf"=>"New Arrivals"}
tag_start: "movie", {"title"=>"Enemy Behind"}
tag_start: "type", {}
   text   :   "War, Thriller"
tag_start: "format", {}
tag_start: "year", {}
tag_start: "rating", {}
tag_start: "stars", {}
tag_start: "description", {}
   text   :   "Talk about a US-Japan war"
tag_start: "movie", {"title"=>"Transformers"}
tag_start: "type", {}
   text   :   "Anime, Science Fiction"
tag_start: "format", {}
tag_start: "year", {}
tag_start: "rating", {}
tag_start: "stars", {}
tag_start: "description", {}
   text   :   "A schientific fiction"
tag_start: "movie", {"title"=>"Trigun"}
tag_start: "type", {}
   text   :   "Anime, Action"
tag_start: "format", {}
tag_start: "episodes", {}
tag_start: "rating", {}
tag_start: "stars", {}
tag_start: "description", {}
   text   :   "Vash the Stampede!"
tag_start: "movie", {"title"=>"Ishtar"}
tag_start: "type", {}
tag_start: "format", {}
tag_start: "rating", {}
tag_start: "stars", {}
tag_start: "description", {}
   text   :   "Viewable boredom"

XPath ve Ruby

XML'i görüntülemenin alternatif bir yolu XPath'dir. Bu, bir XML belgesindeki belirli öğelerin ve özniteliklerin nasıl konumlandırılacağını açıklayan ve bu belgeyi mantıksal sıralı bir ağaç olarak ele alan bir tür sözde dildir.

REXML, XPath sınıfı aracılığıyla XPath desteğine sahiptir . Yukarıda gördüğümüz gibi ağaç temelli ayrıştırmayı (belge nesne modeli) varsayar.

#!/usr/bin/ruby -w

require 'rexml/document'
include REXML

xmlfile = File.new("movies.xml")
xmldoc = Document.new(xmlfile)

# Info for the first movie found
movie = XPath.first(xmldoc, "//movie")
p movie

# Print out all the movie types
XPath.each(xmldoc, "//type") { |e| puts e.text }

# Get an array of all of the movie formats.
names = XPath.match(xmldoc, "//format").map {|x| x.text }
p names

Bu, aşağıdaki sonucu verecektir -

<movie title = 'Enemy Behind'> ... </>
War, Thriller
Anime, Science Fiction
Anime, Action
Comedy
["DVD", "DVD", "DVD", "VHS"]

XSLT ve Ruby

Ruby'nin kullanabileceği iki XSLT ayrıştırıcısı vardır. Her birinin kısa bir açıklaması burada verilmiştir.

Ruby-Sablotron

Bu ayrıştırıcı, Masayoshi Takahashi tarafından yazılır ve sürdürülür. Bu, öncelikle Linux işletim sistemi için yazılmıştır ve aşağıdaki kitaplıkları gerektirir -

  • Sablot
  • Iconv
  • Expat

Bu modülü şu adreste bulabilirsiniz: Ruby-Sablotron.

XSLT4R

XSLT4R, Michael Neumann tarafından yazılmıştır ve RAA'da, XML altındaki Kitaplık bölümünde bulunabilir. XSLT4R, basit bir komut satırı arayüzü kullanır, ancak alternatif olarak bir XML belgesini dönüştürmek için üçüncü taraf bir uygulamada da kullanılabilir.

XSLT4R'nin çalışması için, XSLT4R arşivinde bulunan ve aynı zamanda yüzde 100 Ruby modülü olan XMLScan'e ihtiyacı vardır. Bu modüller, standart Ruby kurulum yöntemi (yani, ruby ​​install.rb) kullanılarak kurulabilir.

XSLT4R aşağıdaki sözdizimine sahiptir -

ruby xslt.rb stylesheet.xsl document.xml [arguments]

XSLT4R'yi bir uygulama içinden kullanmak istiyorsanız, XSLT'yi dahil edebilir ve ihtiyacınız olan parametreleri girebilirsiniz. İşte örnek -

require "xslt"

stylesheet = File.readlines("stylesheet.xsl").to_s
xml_doc = File.readlines("document.xml").to_s
arguments = { 'image_dir' => '/....' }
sheet = XSLT::Stylesheet.new( stylesheet, arguments )

# output to StdOut
sheet.apply( xml_doc )

# output to 'str'
str = ""
sheet.output = [ str ]
sheet.apply( xml_doc )

Daha fazla okuma

  • REXML Ayrıştırıcı hakkında eksiksiz bir ayrıntı için, lütfen REXML Ayrıştırıcı Belgeleri için standart belgelere bakın .

  • XSLT4R'yi RAA Deposundan indirebilirsiniz .

SABUN nedir?

Basit Nesne Erişim Protokolü (SOAP), XML'e ve genellikle (ancak zorunlu olarak değil) HTTP'ye dayalı, çapraz platform ve dilden bağımsız bir RPC protokolüdür.

Uzaktan yordam çağrısını yapan bilgileri kodlamak için XML kullanır ve bu bilgileri bir ağ üzerinden istemcilerden sunuculara ve tersi şekilde taşımak için HTTP kullanır.

SOAP, COM, CORBA vb. Gibi diğer teknolojilere göre çeşitli avantajlara sahiptir: örneğin, nispeten ucuz dağıtım ve hata ayıklama maliyetleri, genişletilebilirliği ve kullanım kolaylığı ve farklı diller ve platformlar için çeşitli uygulamaların varlığı.

Ayrıntılı olarak anlamak için lütfen basit öğretici SABUNumuza bakın .

Bu bölüm, Ruby için SOAP uygulamasına (SOAP4R) aşina olmanızı sağlar. Bu temel bir öğreticidir, bu nedenle derin bir ayrıntıya ihtiyacınız varsa, diğer kaynaklara başvurmanız gerekir.

SOAP4R Kurulumu

SOAP4R, Hiroshi Nakamura tarafından geliştirilen Ruby için SOAP uygulamasıdır ve şu adresten indirilebilir:

NOTE - Bu bileşeni halihazırda yüklemiş olmanız büyük bir olasılık olabilir.

Download SOAP

Eğer farkında iseniz gem yardımcı program daha sonra SOAP4R ve ilgili paketleri yüklemek için aşağıdaki komutu kullanabilirsiniz.

$ gem install soap4r --include-dependencies

Windows üzerinde çalışıyorsanız, yukarıdaki konumdan sıkıştırılmış bir dosya indirmeniz ve ruby install.rb dosyasını çalıştırarak standart kurulum yöntemini kullanarak yüklemeniz gerekir .

SOAP4R Sunucuları Yazma

SOAP4R iki farklı sunucu türünü destekler -

  • CGI / FastCGI tabanlı (SOAP :: RPC :: CGIStub)
  • Bağımsız (SOAP :: RPC: StandaloneServer)

Bu bölüm, bağımsız bir sunucu yazma hakkında ayrıntılı bilgi verir. Aşağıdaki adımlar, bir SOAP sunucusu yazmakla ilgilidir.

Adım 1 - SOAP :: RPC :: StandaloneServer Sınıfını Devralın

Kendi bağımsız sunucunuzu uygulamak için , aşağıdaki gibi SOAP :: StandaloneServer'ın alt öğesi olacak yeni bir sınıf yazmanız gerekir -

class MyServer < SOAP::RPC::StandaloneServer
  ...............
end

NOTE- FastCGI tabanlı bir sunucu yazmak istiyorsanız, SOAP :: RPC :: CGIStub'u üst sınıf olarak almanız gerekir , prosedürün geri kalanı aynı kalacaktır.

Adım 2 - İşleyici Yöntemlerini Tanımlayın

İkinci adım, dış dünyaya göstermek istediğiniz Web Hizmetleri yöntemlerinizi yazmaktır.

Basit Ruby yöntemleri olarak yazılabilirler. Örneğin, iki sayıyı toplamak ve iki sayıyı bölmek için iki yöntem yazalım -

class MyServer < SOAP::RPC::StandaloneServer
   ...............

   # Handler methods
   def add(a, b)
      return a + b
   end
   def div(a, b) 
      return a / b 
   end
end

Adım 3 - İşleyici Yöntemlerini Açığa Çıkarın

Sonraki adım, tanımladığımız yöntemleri sunucumuza eklemektir. İnitialize yöntem aşağıdaki iki yöntemden biri ile hizmet yöntemleri göstermek için kullanılır -

class MyServer < SOAP::RPC::StandaloneServer
   def initialize(*args)
      add_method(receiver, methodName, *paramArg)
   end
end

İşte parametrelerin açıklaması -

Sr.No. Parametre ve Açıklama
1

receiver

MethodName yöntemini içeren nesne. Bu parametredir, methodDef yöntemi olarak aynı sınıfta hizmet yöntemlerini tanımlar kendini .

2

methodName

Bir RPC isteği nedeniyle çağrılan yöntemin adı.

3

paramArg

Verildiğinde, parametre adlarını ve parametre modlarını belirtir.

Kullanımını anlamak için inout veya dışarı parametreleri, iki parametre (inParam ve inoutParam), döner bir normal dönüş değeri (retVal) ve iki başka parametre alır aşağıdaki hizmet yöntemini göz önünde bulundurun: inoutParam ve outParam -

def aMeth(inParam, inoutParam)
   retVal = inParam + inoutParam
   outParam = inParam . inoutParam
   inoutParam = inParam * inoutParam
   return retVal, inoutParam, outParam
end

Şimdi, bu yöntemi şu şekilde ortaya çıkarabiliriz -

add_method(self, 'aMeth', [
   %w(in inParam),
   %w(inout inoutParam),
   %w(out outParam),
   %w(retval return)
])

Adım 4 - Sunucuyu Başlatın

Son adım, türetilmiş sınıfın bir örneğini oluşturarak ve bunu çağırarak sunucunuzu başlatmaktır. start yöntem.

myServer = MyServer.new('ServerName', 'urn:ruby:ServiceName', hostname, port)

myServer.start

İşte gerekli parametrelerin açıklaması -

Sr.No. Parametre ve Açıklama
1

ServerName

Bir sunucu adı, en sevdiğiniz şeyi verebilirsiniz.

2

urn:ruby:ServiceName

Burada urn: ruby sabittir ancak bu sunucu için benzersiz bir ServisAdı adı verebilirsiniz.

3

hostname

Bu sunucunun dinleyeceği ana bilgisayar adını belirtir.

4

port

Web hizmeti için kullanılacak mevcut bir bağlantı noktası numarası.

Misal

Şimdi, yukarıdaki adımları kullanarak tek bir bağımsız sunucu yazalım -

require "soap/rpc/standaloneserver"

begin
   class MyServer < SOAP::RPC::StandaloneServer

      # Expose our services
      def initialize(*args)
         add_method(self, 'add', 'a', 'b')
         add_method(self, 'div', 'a', 'b')
      end

      # Handler methods
      def add(a, b)
         return a + b
      end
      def div(a, b) 
         return a / b 
      end
end
   server = MyServer.new("MyServer", 
            'urn:ruby:calculation', 'localhost', 8080)
   trap('INT){
      server.shutdown
   }
   server.start
rescue => err
   puts err.message
end

Yürütüldüğünde, bu sunucu uygulaması localhost'ta bağımsız bir SOAP sunucusu başlatır ve 8080 numaralı bağlantı noktasındaki istekleri dinler. İki parametre alan ve sonucu döndüren add ve div adında bir hizmet yöntemi sunar .

Şimdi, bu sunucuyu aşağıdaki gibi arka planda çalıştırabilirsiniz -

$ ruby MyServer.rb&

SOAP4R İstemcileri Yazma

SABUN :: RPC :: Sürücü sınıf SABUN istemci uygulamaları yazmak için destek sağlar. Bu bölüm, bu sınıfı açıklar ve bir uygulama temelinde kullanımını gösterir.

Bir SOAP servisini aramak için ihtiyaç duyacağınız asgari bilgiler aşağıdadır -

  • SOAP hizmetinin URL'si (SOAP Uç Nokta URL'si).
  • Hizmet yöntemlerinin ad alanı (Yöntem Ad Alanı URI'si).
  • Servis yöntemlerinin isimleri ve parametreleri.

Şimdi yukarıdaki örnekte tanımlanan, add ve div adında servis yöntemlerini çağıran bir SOAP istemcisi yazacağız .

SOAP istemcisi oluşturmanın ana adımları aşağıda verilmiştir.

Adım 1 - Bir SOAP Sürücü Örneği Oluşturun

Yeni metodunu aşağıdaki gibi çağırarak SOAP :: RPC :: Driver örneğini oluşturuyoruz -

SOAP::RPC::Driver.new(endPoint, nameSpace, soapAction)

İşte gerekli parametrelerin açıklaması -

Sr.No. Parametre ve Açıklama
1

endPoint

Bağlanılacak SOAP sunucusunun URL'si.

2

nameSpace

Bu SOAP :: RPC :: Driver nesnesiyle yapılan tüm RPC'ler için kullanılacak ad alanı.

3

soapAction

HTTP başlığının SOAPAction alanı için bir değer. Eğer nil ise, bu varsayılan olarak boş "" dizgisidir.

Adım 2 - Servis Yöntemleri Ekleyin

SOAP :: RPC :: Driver'a bir SOAP servis metodu eklemek için SOAP :: RPC :: Driver örneğini kullanarak aşağıdaki metodu çağırabiliriz -

driver.add_method(name, *paramArg)

İşte parametrelerin açıklaması -

Sr.No. Parametre ve Açıklama
1

name

Uzak web hizmeti yönteminin adı.

2

paramArg

Uzak prosedür parametrelerinin adlarını belirtir.

Adım 3 - SOAP hizmetini çağırın

Son adım, SOAP :: RPC :: Driver örneğini kullanarak SOAP servisini aşağıdaki gibi faturalandırmaktır -

result = driver.serviceMethod(paramArg...)

Burada serviceMethod gerçek web hizmeti yöntemidir ve paramArg ... hizmet yönteminde geçmek için gereken liste parametreleridir.

Example

Yukarıdaki adımlara dayanarak, aşağıdaki gibi bir SOAP istemcisi yazacağız -

#!/usr/bin/ruby -w

require 'soap/rpc/driver'

NAMESPACE = 'urn:ruby:calculation'
URL = 'http://localhost:8080/'

begin
   driver = SOAP::RPC::Driver.new(URL, NAMESPACE)
   
   # Add remote sevice methods
   driver.add_method('add', 'a', 'b')

   # Call remote service methods
   puts driver.add(20, 30)
rescue => err
   puts err.message
end

Diğer Okumalar

Size Ruby ile Web Hizmetlerinin çok temel kavramlarını açıkladım. Daha fazla ayrıntıya inmek isterseniz , Ruby ile Web Hizmetleri hakkında daha fazla ayrıntı bulmak için aşağıdaki bağlantı mevcuttur .

Giriş

Ruby için standart grafik kullanıcı arayüzü (GUI) Tk'dir. Tk, John Ousterhout tarafından geliştirilen Tcl betik dili için GUI olarak başladı.

Tk, platformlar arası tek GUI olma özelliğine sahiptir. Tk, Windows, Mac ve Linux üzerinde çalışır ve her işletim sisteminde yerel bir görünüm ve his sağlar.

Tk tabanlı bir uygulamanın temel bileşenine widget denir. Bir bileşene bazen pencere de denir, çünkü Tk'de "pencere" ve "pencere öğesi" genellikle birbirinin yerine kullanılır.

Tk uygulamaları, herhangi bir sayıda widget'ın başka bir widget'a ve bu widget'ların başka bir widget'a (sonsuza kadar) yerleştirilebildiği bir widget hiyerarşisini takip eder. Bir Tk programındaki ana pencere öğesi, kök pencere öğesi olarak adlandırılır ve TkRoot sınıfının yeni bir örneği oluşturularak oluşturulabilir.

  • Çoğu Tk tabanlı uygulama aynı döngüyü izler: pencere öğeleri oluşturun, bunları arabirime yerleştirin ve son olarak, her pencere öğesi ile ilişkili olayları bir yönteme bağlayın.

  • Üç geometri yöneticisi vardır; Arayüzdeki her bir parçacığın boyutunu ve konumunu kontrol etmekten sorumlu olan yer, ızgara ve paket .

Kurulum

Ruby Tk bağlamaları Ruby ile dağıtılır ancak Tk ayrı bir kurulumdur. Windows kullanıcıları ActiveState'in ActiveTcl'den tek tıkla Tk kurulumunu indirebilir .

Mac ve Linux kullanıcılarının yüklemesi gerekmeyebilir çünkü işletim sistemi ile birlikte halihazırda kurulu olması büyük bir olasılıktır, ancak yoksa önceden oluşturulmuş paketleri indirebilir veya kaynağı Tcl Developer Xchange'den alabilirsiniz .

Basit Tk Uygulaması

Ruby / Tk programları için tipik bir yapı, ana veya root penceresi (bir TkRoot örneği), kullanıcı arayüzünü oluşturmak için ona widget ekleyin ve ardından ana olay döngüsünü çağırarak başlatın. Tk.mainloop.

Geleneksel Merhaba, Dünya! Ruby / Tk için örnek şuna benzer -

require 'tk'

root = TkRoot.new { title "Hello, World!" }
TkLabel.new(root) do
   text 'Hello, World!'
   pack { padx 15 ; pady 15; side 'left' }
end
Tk.mainloop

Burada tk eklenti modülünü yükledikten sonra TkRoot.new kullanarak kök seviyesinde bir çerçeve oluşturuyoruz . Ardından , kök çerçevenin alt öğesi olarak bir TkLabel parçacığı oluşturarak etiket için birkaç seçenek belirledik. Son olarak, kök çerçeveyi paketliyoruz ve ana GUI olay döngüsüne giriyoruz.

Bu komut dosyasını çalıştırırsanız, aşağıdaki sonucu üretir -

Ruby / Tk Widget Sınıfları

Ruby / Tk kullanarak istenen bir GUI oluşturmak için kullanılabilecek çeşitli Ruby / Tk sınıflarının bir listesi vardır.

  • TkFrame Çerçeve parçacıkları oluşturur ve işler .

  • TkButton Düğme widget'larını oluşturur ve işler .

  • TkLabel Etiket parçacıkları oluşturur ve işler .

  • TkEntry Giriş widget'larını oluşturur ve işler .

  • TkCheckButton Onay düğmesi widget'larını oluşturur ve işler .

  • TkRadioButton radiobutton widget'larını oluşturur ve işler .

  • TkListbox Liste kutusu widget'larını oluşturur ve işler .

  • TkComboBox Liste kutusu widget'larını oluşturur ve işler .

  • TkMenu Menü widget'larını oluşturur ve işler .

  • TkMenubutton Menü butonu widget'larını oluşturur ve işler.

  • Tk.messageBox Bir mesaj iletişim kutusu oluşturur ve işler .

  • TkScrollbar Kaydırma çubuğu widget'larını oluşturur ve işler .

  • TkCanvas, tuval widget'larını oluşturur ve işler .

  • TkScale Ölçek widget'ları oluşturur ve işler .

  • TkText Metin widget'ları oluşturur ve işler .

  • TkToplevel Üst düzey widget'ları oluşturur ve işler .

  • TkSpinbox Spinbox widget'larını oluşturur ve işler.

  • TkProgressBar İlerleme Çubuğu widget'larını oluşturur ve işler .

  • İletişim Kutusu İletişim Kutusu widget'larını oluşturur ve işler.

  • Tk :: Tile :: Notebook Dizüstü bilgisayar metaforu ile sınırlı bir alanda birkaç pencere görüntüleyin.

  • Tk :: Tile :: Paned Dikey veya yatay olarak istiflenmiş bir dizi alt pencere görüntüler.

  • Tk :: Tile :: Separator Yatay veya dikey bir ayırıcı çubuk görüntüler.

  • Ruby / Tk Yazı Tipi, Renkler ve Görüntüler Ruby / Tk Yazı Tiplerini, Renkleri ve Resimleri Anlama

Standart Yapılandırma Seçenekleri

Tüm widget'ların, genellikle nasıl görüntülendiklerini veya nasıl davrandıklarını kontrol eden bir dizi farklı yapılandırma seçeneği vardır. Kullanılabilen seçenekler elbette widget sınıfına bağlıdır.

Herhangi bir Ruby / Tk parçacığı için geçerli olabilecek tüm standart yapılandırma seçeneklerinin listesi burada.

Sr.No. Seçenekler ve Açıklama
1

activebackground => Dize

Aktif elemanları çizerken kullanılacak arka plan rengini belirtir. Fare imleci öğenin üzerindeyse bir öğe etkindir ve bir fare düğmesine basmak bazı eylemlerin gerçekleşmesine neden olur. "Kırmızı", "mavi", "pembe", "sarı" vb. Renk adlarını kullanabilirsiniz.

2

activeborderwidth => Tamsayı

Etkin elemanların etrafına çizilen 3-B kenarlığın genişliğini gösteren negatif olmayan bir değer belirtir.

3

activeforeground => Dize

Aktif öğeleri çizerken kullanılacak ön plan rengini belirtir.

4

anchor => Dize

Bir pencere öğesindeki (örneğin, metin veya bitmap) bilgilerin pencere öğesinde nasıl görüntüleneceğini belirtir. Değerlerden biri olmalın, ne, e, se, s, sw, w, nwveya center. Örneğin,nw bilgileri, sol üst köşesi widget'ın sol üst köşesinde olacak şekilde görüntüleme anlamına gelir.

5

background or bg => Dize

Widget görüntülenirken kullanılacak normal arka plan rengini belirtir.

6

bitmap => Bit eşlem

Widget'ta görüntülenecek bir bitmap belirtir. Bitmap'in tam olarak görüntülenme şekli, çapa veya yaslama gibi diğer seçeneklerden etkilenebilir.

7

borderwidth or bd => Tamsayı

Widget'ın dış çevresine çizilecek 3-B kenarlığın genişliğini belirten negatif olmayan bir değer belirtir.

8

compound => Dize

Widget'ın metni ve bitmap'leri / resimleri aynı anda görüntüleyip görüntülemeyeceğini ve öyleyse, bitmap / görüntünün metne göre nereye yerleştirilmesi gerektiğini belirtir. Değerlerden biri olmalınone, bottom, top, left, rightveya center.

9

cursor => Dize

Widget için kullanılacak fare imlecini belirtir. Olası değerler "izle", "ok" vb. Olabilir.

10

disabledforeground => Dize

Devre dışı bırakılmış bir öğeyi çizerken kullanılacak ön plan rengini belirtir.

11

exportselection => Boole

Widget'taki bir seçimin de X seçimi olup olmayacağını belirtir. Değer şunlardan herhangi birine sahip olabilir:true, false, 0, 1, yesveya no. Seçim dışa aktarılırsa, widget'ta seçmek geçerli X seçiminin seçimini kaldırır, widget'ın dışını seçmek herhangi bir widget seçiminin seçimini kaldırır ve widget bir seçime sahip olduğunda seçim alma isteklerine yanıt verir.

12

font => Dize

Widget içinde metin çizerken kullanılacak yazı tipini belirtir.

13

foreground or fg => Dize

Widget görüntülenirken kullanılacak normal ön plan rengini belirtir.

14

highlightbackground => Dize

Widget giriş odağına sahip olmadığında geçiş vurgulama bölgesinde görüntülenecek rengi belirtir.

15

highlightcolor => Dize

Giriş odağına sahip olduğunda widget'in etrafına çizilen çapraz vurgu dikdörtgeni için kullanılacak rengi belirtir.

16

highlightthickness => Tamsayı

Giriş odağı olduğunda widget'ın dışının çevresine çizilecek vurgu dikdörtgeninin genişliğini belirten negatif olmayan bir değer belirtir.

17

image => Resim

Bir görüntü oluşturma ile oluşturulmuş olması gereken, widget'ta görüntülenecek bir görüntüyü belirtir. Tipik olarak, görüntü seçeneği belirtilirse, widget'ta görüntülenecek bir bitmap veya metin değeri belirten diğer seçenekleri geçersiz kılar; görüntü seçeneği, bir bitmap veya metin görüntüsünü yeniden etkinleştirmek için boş bir dizeye sıfırlanabilir.

18

jump => Dize

Kaydırma çubukları ve ölçekler gibi bir değeri ayarlamak için sürüklenebilen kaydırıcıya sahip widget'lar için bu seçenek, değerdeki değişikliklerle ilgili bildirimlerin ne zaman yapılacağını belirler. Seçeneğin değeri bir boole olmalıdır. Değer yanlışsa, kaydırıcı sürüklenirken sürekli olarak güncellemeler yapılır. Değer true ise, sürüklemeyi sona erdirmek için fare düğmesi bırakılana kadar güncellemeler ertelenir; bu noktada tek bir bildirim yapılır.

19

justify => Dize

Bir pencere öğesinde görüntülenen birden çok metin satırı olduğunda, bu seçenek satırların birbiriyle nasıl hizalanacağını belirler. Biri olmalıleft, centerveya right. Left çizgilerin sol kenarlarının tümü aynı hizada olduğu anlamına gelir, center hatların merkezlerinin hizalandığı ve right çizgilerin sağ kenarlarının aynı hizada olduğu anlamına gelir.

20

offset => Dize

Döşemelerin ofsetini belirtir (ayrıca bkz. tileseçenek). İki farklı formata sahip olabiliroffset x,y veya offset side, yan nerede olabilir n, ne, e, se, s, sw, w, nwveya center.

21

orient => Dize

Kaydırma çubukları gibi kendilerini yatay veya dikey yönde yerleştirebilen widget'lar için bu seçenek, hangi yönün kullanılması gerektiğini belirler. Biri olmalıhorizontal veya vertical veya bunlardan birinin kısaltması.

22

padx => Tamsayı

X yönünde pencere öğesi için ne kadar fazladan alan talep edileceğini belirten negatif olmayan bir değer belirtir.

23

pady => Tamsayı

Y yönünde widget için ne kadar fazladan alan talep edileceğini belirten negatif olmayan bir değer belirtir.

24

relief => Tamsayı

Widget için istenen 3-D efekti belirtir. Kabul edilebilir değerlerraised, sunken, flat, ridge, ve groove.

25

repeatdelay => Tamsayı

Otomatik tekrarlamaya başlamadan önce bir düğmenin veya tuşun basılı tutulması gereken milisaniye sayısını belirtir. Örneğin, kaydırma çubuklarındaki yukarı ve aşağı oklarda kullanılır.

26

repeatinterval => Tamsayı

İle birlikte kullanılır repeatdelay: otomatik tekrar başladığında, bu seçenek otomatik tekrarlar arasındaki milisaniye sayısını belirler

27

selectbackground => Dize

Seçili öğeleri görüntülerken kullanılacak arka plan rengini belirtir.

28

selectborderwidth => Tamsayı

Seçili öğelerin çevresini çizmek için 3-B kenarlığın genişliğini belirten negatif olmayan bir değer belirtir.

29

selectforeground => Dize

Seçili öğeleri görüntülerken kullanılacak ön plan rengini belirtir.

30

setgrid => Boole

Bu widget'ın, üst düzey penceresi için yeniden boyutlandırma ızgarasını kontrol edip etmediğini belirleyen bir boolean değeri belirtir. Bu seçenek tipik olarak, pencere aracındaki bilgilerin doğal bir boyuta (bir karakterin boyutuna) sahip olduğu ve pencere boyutlarının bu birimlerin tamsayıları olması mantıklı olan metin widget'larında kullanılır.

31

takefocus => Tamsayı

Odağı bir pencereden pencereye klavye geçişi yoluyla taşırken kullanılan bilgileri sağlar (örn. Sekme ve Shift-Sekme). Odağı bir pencereye ayarlamadan önce, geçiş komut dosyaları önce pencerenin görüntülenebilir olup olmadığını kontrol eder (pencere ve tüm ataları eşlenir); değilse, pencere atlanır. 0 değeri, bu pencerenin klavye geçişi sırasında tamamen atlanması gerektiği anlamına gelir. 1, bu pencerenin her zaman giriş odağını alması gerektiği anlamına gelir.

32

text => Dize

Widget içinde görüntülenecek dizeyi belirtir. Dizenin görüntülenme şekli belirli bir parçacığa bağlıdır ve aşağıdakiler gibi diğer seçenekler tarafından belirlenebilir:anchor veya justify.

33

textvariable => Değişken

Bir değişkenin adını belirtir. Değişkenin değeri, pencere öğesinin içinde görüntülenecek bir metin dizesidir; değişken değeri değişirse, pencere öğesi yeni değeri yansıtmak için kendini otomatik olarak güncelleyecektir. Dizenin pencere aracında görüntülenme şekli, belirli pencere aracına bağlıdır ve aşağıdakiler gibi diğer seçenekler tarafından belirlenebilir:anchor veya justify.

34

tile => Resim

Widget'ı görüntülemek için kullanılan resmi belirtir. Görüntü boş dizeyse, normal arka plan rengi görüntülenir.

35

troughcolor => Dize

Kaydırma çubukları ve ölçekler gibi widget'larda dikdörtgen oluk alanları için kullanılacak rengi belirtir.

36

troughtile => Resim

Kaydırma çubukları ve ölçekler gibi widget'larda dikdörtgen çukur alanlarında görüntülenmek için kullanılan görüntüyü belirtir.

37

underline => Tamsayı

Widget'ta altı çizilecek bir karakterin tamsayı dizinini belirtir. Bu seçenek, menü düğmeleri ve menü girişleri için klavye geçişini uygulamak için varsayılan bağlamalar tarafından kullanılır. 0, widget'ta görüntülenen metnin ilk karakterine, 1 sonraki karaktere vb. Karşılık gelir.

38

wraplength => Tamsayı

Sözcük kaydırma yapabilen gereçler için bu seçenek maksimum satır uzunluğunu belirtir.

39

xscrollcommand => işlev

Yatay kaydırma çubuklarıyla iletişim kurmak için kullanılan bir geri aramayı belirtir.

40

yscrollcommand => işlev

Dikey kaydırma çubuklarıyla iletişim kurmak için kullanılan bir geri aramayı belirtir.

Ruby / Tk Geometri Yönetimi

Geometri Yönetimi, ihtiyaca göre farklı widget'ların konumlandırılmasıyla ilgilenir. Tk'da geometri yönetimi, ana ve bağımlı pencere öğeleri kavramına dayanır.

Kalıp, ikincil olarak adlandırılan diğer parçacıkları içeren bir parçacık, tipik olarak bir üst düzey pencere veya çerçevedir. Bir geometri yöneticisini ana parçacığın kontrolünü ele geçiriyor ve içinde neyin görüntüleneceğine karar veriyor olarak düşünebilirsiniz.

Geometri yöneticisi, her bir yardımcı parçacığın doğal boyutunu veya ideal olarak görüntülenmesinin ne kadar büyük olmasını istediğini soracaktır. Daha sonra bu bilgiyi alır ve geometri yöneticisinden söz konusu yardımcı parçacığı yönetmesini istediğinde program tarafından sağlanan parametrelerle birleştirir.

Arayüzdeki her bir parçacığın boyutunu ve konumunu kontrol etmekten sorumlu üç geometri yöneticisi yer, ızgara ve paket vardır.

  • ızgara Geometri yöneticisi bir ızgarada widget'ları düzenler.

  • paket Geometri yöneticisi paketi çevresinde boşluğun kenarları.

  • yerleştirmek sabit veya lastik levha yerleştirme için Geometri yöneticisi.

Ruby / Tk Olay İşleme

Ruby / Tk , işletim sisteminden olayları alan olay döngüsünü destekler . Bunlar, düğmeye basma, tuş vuruşları, fare hareketi, pencereyi yeniden boyutlandırma vb. Gibi şeylerdir.

Ruby / Tk bu olay döngüsünü sizin için yönetir. Olayın hangi pencere öğesi için geçerli olduğunu bulacak (kullanıcı bu düğmeye tıkladı mı? Bir tuşa basıldıysa, odak hangi metin kutusuna sahipti?) Ve buna göre gönderecektir. Tek tek widget'lar olaylara nasıl yanıt verileceğini bilir, bu nedenle örneğin bir düğme fare üzerine geldiğinde renk değiştirebilir ve fare çıkınca geri dönebilir.

Daha yüksek bir düzeyde, Ruby / Tk, bir parçacığa önemli bir şey olduğunu belirtmek için programınızda geri aramaları çağırır. Her iki durumda da, uygulamanın olaya veya geri aramaya nasıl yanıt vereceğini belirten bir kod bloğu veya Ruby Proc nesnesi sağlayabilirsiniz.

Temel pencere sistemi olaylarını, onları işleyen Ruby prosedürleriyle ilişkilendirmek için bind yönteminin nasıl kullanılacağına bir göz atalım. Bağlamanın en basit biçimi, girdileri olarak olay adını ve Tk'nin olayı işlemek için kullandığı bir kod bloğunu belirten bir dizge alır.

Örneğin, bir widget'taki ilk fare düğmesi için ButtonRelease olayını yakalamak için şunu yazarsınız:

someWidget.bind('ButtonRelease-1') {
   ....code block to handle this event...
}

Bir olay adı, ek değiştiriciler ve ayrıntılar içerebilir. Değiştirici , değiştirici tuşlardan birine basıldığını belirten Shift , Control veya Alt gibi bir dizedir .

Örneğin, kullanıcı Ctrl tuşunu basılı tutup sağ fare düğmesini tıkladığında oluşturulan olayı yakalamak için .

someWidget.bind('Control-ButtonPress-3', proc { puts "Ouch!" })

Pek çok Ruby / Tk pencere öğesi , kullanıcı bunları etkinleştirdiğinde geri çağrıları tetikleyebilir ve bu gerçekleştiğinde belirli bir kod bloğunun veya prosedürün çağrılacağını belirtmek için geri çağrı komutunu kullanabilirsiniz . Daha önce görüldüğü gibi, widget'ı oluşturduğunuzda komut geri çağırma prosedürünü belirtebilirsiniz -

helpButton = TkButton.new(buttonFrame) {
   text "Help"
   command proc { showHelp }
}

Veya daha sonra, widget'ın komut yöntemini kullanarak atayabilirsiniz -

helpButton.command proc { showHelp }

Komut yöntemi prosedürleri veya kod bloklarını kabul ettiğinden, önceki kod örneğini şu şekilde de yazabilirsiniz:

helpButton = TkButton.new(buttonFrame) {
   text "Help"
   command { showHelp }
}
Sr.No. Etiket ve Etkinlik Açıklaması
1

"1" (one)

Sol fare düğmesine tıklandı.

2

"ButtonPress-1"

Sol fare düğmesine tıklandı.

3

"Enter"

Fare içeriye taşındı.

4

"Leave"

Fare dışarı taşındı.

5

"Double-1"

Çift tıklandı.

6

"B3-Motion"

Sağ düğme bir konumdan diğerine sürükleyin.

7

Control-ButtonPress-3

Sağ tuşa Ctrl tuşu ile birlikte basılır .

8

Alt-ButtonPress-1

Alt Tuşu ile Let butonuna basılır .

Yapılandırma Yöntemi

Yapılandırmak yöntemi setine kullanılan ve herhangi bir Widget yapılandırma değerleri almak edilebilir. Örneğin, bir düğmenin genişliğini değiştirmek için, istediğiniz zaman aşağıdaki gibi configure yöntemini çağırabilirsiniz -

require "tk"

button = TkButton.new {
   text 'Hello World!'
   pack
}
button.configure('activebackground', 'blue')
Tk.mainloop

Mevcut bir parçacığın değerini almak için, aşağıdaki gibi bir değer olmadan sağlamanız yeterlidir -

color = button.configure('activebackground')

Ayrıca hiçbir seçenek olmadan da configure'ü çağırabilirsiniz, bu size tüm seçeneklerin ve bunların değerlerinin bir listesini verir.

Cget Yöntemi

Basitçe bir seçeneğin değerini almak için, configure betiği genel olarak istediğinizden daha fazla bilgi döndürür. Cget yöntemi yalnızca geçerli değeri döndürür.

color = button.cget('activebackground')

Ruby / LDAP, Ruby için bir uzantı kitaplığıdır. OpenLDAP, UMich LDAP, Netscape SDK, ActiveDirectory gibi bazı LDAP kitaplıklarına arayüz sağlar.

Uygulama geliştirme için ortak API, RFC1823'te açıklanmıştır ve Ruby / LDAP tarafından desteklenir.

Ruby / LDAP Kurulumu

SOURCEFORGE.NET'ten eksiksiz bir Ruby / LDAP paketi indirebilir ve kurabilirsiniz .

Ruby / LDAP'yi kurmadan önce, aşağıdaki bileşenlere sahip olduğunuzdan emin olun -

  • Ruby 1.8.x (ldap / control kullanmak istiyorsanız en az 1.8.2).
  • OpenLDAP, Netscape SDK, Windows 2003 veya Windows XP.

Artık standart Ruby Kurulum yöntemini kullanabilirsiniz. Başlamadan önce, extconf.rb için mevcut seçenekleri görmek istiyorsanız, '--help' seçeneğiyle çalıştırın.

$ ruby extconf.rb [--with-openldap1|--with-openldap2| \
                   --with-netscape|--with-wldap32]
$ make $ make install

NOTE- Yazılımı Windows üzerinde oluşturuyorsanız , make yerine nmake kullanmanız gerekebilir .

LDAP Bağlantısı Kurun

Bu iki aşamalı bir süreçtir -

Adım 1 - Bağlantı Nesnesi Oluşturun

Aşağıda bir LDAP dizinine bağlantı oluşturmak için sözdizimi verilmiştir.

LDAP::Conn.new(host = 'localhost', port = LDAP_PORT)
  • host- Bu, LDAP dizinini çalıştıran ana bilgisayar kimliğidir. Bunu localhost olarak alacağız .

  • port- Bu, LDAP hizmeti için kullanılan bağlantı noktasıdır. Standart LDAP bağlantı noktaları 636 ve 389'dur. Sunucunuzda hangi bağlantı noktasının kullanıldığından emin olun, aksi takdirde LDAP :: LDAP_PORT'u kullanabilirsiniz.

Bu çağrı , bağlantı noktası bağlantı noktasındaki sunucuya, ana bilgisayara yeni bir LDAP :: Conn bağlantısı döndürür .

Adım 2 - Bağlama

Bu, genellikle oturumun geri kalanında kullanacağımız kullanıcı adı ve parolayı belirttiğimiz yerdir.

Aşağıda, DN kullanarak bir LDAP bağlantısını bağlamak için sözdizimi verilmiştir, dnkimlik bilgisi, pwdve bağlama yöntemi, method -

conn.bind(dn = nil, password = nil, method = LDAP::LDAP_AUTH_SIMPLE)do
....
end

Aynı yöntemi bir kod bloğu olmadan da kullanabilirsiniz. Bu durumda, bağlantıyı aşağıdaki gibi açıkça çözmeniz gerekir:

conn.bind(dn = nil, password = nil, method = LDAP::LDAP_AUTH_SIMPLE)
....
conn.unbind

Bir kod bloğu verilirse, self bloğa verilir .

Artık uygun izinlere sahip olmamız koşuluyla, bağlama yönteminin bloğu içinde (bağlama ve çözme arasında) arama, ekleme, değiştirme veya silme işlemleri gerçekleştirebiliriz.

Example

Yerel bir sunucu üzerinde çalıştığımızı varsayarsak, uygun ana bilgisayar, etki alanı, kullanıcı kimliği ve şifre vb. İle bir araya getirelim.

#/usr/bin/ruby -w

require 'ldap'

$HOST = 'localhost' $PORT =    LDAP::LDAP_PORT
$SSLPORT = LDAP::LDAPS_PORT conn = LDAP::Conn.new($HOST, $PORT)
conn.bind('cn = root, dc = localhost, dc = localdomain','secret')
....
conn.unbind

LDAP Girişi Ekleme

Bir LDPA girişi eklemek iki adımlı bir işlemdir -

Adım 1 - LDAP :: Mod nesnesinin oluşturulması

Bir girdi oluşturmak için conn.add yöntemine LDAP :: Mod nesne geçişine ihtiyacımız var . İşte LDAP :: Mod nesnesini oluşturmak için basit bir sözdizimi -

Mod.new(mod_type, attr, vals)
  • mod_type - Bir veya daha fazla seçenek LDAP_MOD_ADD, LDAP_MOD_REPLACE veya LDAP_MOD_DELETE.

  • attr - üzerinde işlem yapılacak özelliğin adı olmalıdır.

  • vals- öznitelik ile ilgili bir değerler dizisidir . Eğer vals iki veriler içeriyor, mod_type LDAP_MOD_BVALUES ile | () mantıksal OR'ed edilmelidir.

Bu çağrı , LDAP :: Conn sınıfındaki Conn # add, Conn # add_ext, Conn # change ve Conn # modify_ext gibi yöntemlere aktarılabilen LDAP :: Mod nesnesini döndürür .

Adım 2 - Conn.add Yönteminin Çağrılması

LDAP :: Mod nesnesiyle hazır olduğumuzda, bir girdi oluşturmak için conn.add yöntemini çağırabiliriz . İşte bu yöntemi çağırmak için bir sözdizimi -

conn.add(dn, attrs)

Bu yöntem DN ile bir giriş ekler dn ve özelliklerini, attrs . Burada, öznitelikler ya bir LDAP :: Mod nesneleri dizisi ya da öznitelik / değer dizi çiftlerinin bir karması olmalıdır.

Example

İşte iki dizin girişi oluşturacak eksiksiz bir örnek -

#/usr/bin/ruby -w

require 'ldap'

$HOST =    'localhost'
$PORT = LDAP::LDAP_PORT $SSLPORT = LDAP::LDAPS_PORT

conn = LDAP::Conn.new($HOST, $PORT)
conn.bind('cn = root, dc = localhost, dc = localdomain','secret')

conn.perror("bind")
entry1 = [
   LDAP.mod(LDAP::LDAP_MOD_ADD,'objectclass',['top','domain']),
   LDAP.mod(LDAP::LDAP_MOD_ADD,'o',['TTSKY.NET']),
   LDAP.mod(LDAP::LDAP_MOD_ADD,'dc',['localhost']),
]

entry2 = [
   LDAP.mod(LDAP::LDAP_MOD_ADD,'objectclass',['top','person']),
   LDAP.mod(LDAP::LDAP_MOD_ADD, 'cn', ['Zara Ali']),
   LDAP.mod(LDAP::LDAP_MOD_ADD | LDAP::LDAP_MOD_BVALUES, 'sn', 
                     ['ttate','ALI', "zero\000zero"]),
]

begin
   conn.add("dc = localhost, dc = localdomain", entry1)
   conn.add("cn = Zara Ali, dc = localhost, dc =  localdomain", entry2)
rescue LDAP::ResultError
   conn.perror("add")
   exit
end
conn.perror("add")
conn.unbind

Bir LDAP Girişini Değiştirme

Bir girişi değiştirmek, bir giriş eklemeye benzer. Değiştirilecek niteliklerle eklemek yerine değiştirme yöntemini çağırmanız yeterlidir. İşte değiştirme yönteminin basit bir sözdizimi .

conn.modify(dn, mods)

Bu yöntem, DN, dn ve öznitelikler, modlar ile bir girişi değiştirir . Burada, modlar ya bir LDAP :: Mod nesneleri dizisi ya da bir öznitelik / değer dizisi çiftleri karması olmalıdır.

Misal

Önceki bölümde eklediğimiz girdinin soyadını değiştirmek için şunu yazardık -

#/usr/bin/ruby -w

require 'ldap'

$HOST = 'localhost' $PORT =    LDAP::LDAP_PORT
$SSLPORT = LDAP::LDAPS_PORT conn = LDAP::Conn.new($HOST, $PORT)
conn.bind('cn = root, dc = localhost, dc = localdomain','secret')

conn.perror("bind")
entry1 = [
   LDAP.mod(LDAP::LDAP_MOD_REPLACE, 'sn', ['Mohtashim']),
]

begin
   conn.modify("cn = Zara Ali, dc = localhost, dc = localdomain", entry1)
rescue LDAP::ResultError
   conn.perror("modify")
   exit
end
conn.perror("modify")
conn.unbind

Bir LDAP Girişini Silme

Bir girişi silmek için, parametre olarak ayırt edici adı olan silme yöntemini çağırın . İşte silme yönteminin basit bir sözdizimi .

conn.delete(dn)

Bu yöntem, DN, dn ile bir girişi siler .

Misal

Bir önceki bölümde eklediğimiz Zara Mohtashim girişini silmek için şunu yazardık -

#/usr/bin/ruby -w

require 'ldap'

$HOST =    'localhost'
$PORT = LDAP::LDAP_PORT $SSLPORT = LDAP::LDAPS_PORT

conn = LDAP::Conn.new($HOST, $PORT)
conn.bind('cn = root, dc = localhost, dc = localdomain','secret')

conn.perror("bind")
begin
   conn.delete("cn = Zara-Mohtashim, dc = localhost, dc = localdomain")
rescue LDAP::ResultError
   conn.perror("delete")
   exit
end
conn.perror("delete")
conn.unbind

Ayırt Edici Adı Değiştirme

Bir girişin ayırt edici adını değiştirme yöntemiyle değiştirmek mümkün değildir . Bunun yerine modrdn yöntemini kullanın . İşte modrdn yönteminin basit sözdizimi -

conn.modrdn(dn, new_rdn, delete_old_rdn)

Bu yöntem, girdinin RDN'sini DN, dn ile değiştirerek ona yeni RDN, new_rdn verir . Eğer delete_old_rdn olduğu doğrudur , eski RDN'de değer girişi silinecektir.

Misal

Aşağıdaki girişe sahip olduğumuzu varsayalım -

dn: cn = Zara Ali,dc = localhost,dc = localdomain
cn: Zara Ali
sn: Ali
objectclass: person

Ardından, ayırt edici adını aşağıdaki kodla değiştirebiliriz -

#/usr/bin/ruby -w

require 'ldap'

$HOST = 'localhost' $PORT =    LDAP::LDAP_PORT
$SSLPORT = LDAP::LDAPS_PORT conn = LDAP::Conn.new($HOST, $PORT)
conn.bind('cn = root, dc = localhost, dc = localdomain','secret')

conn.perror("bind")
begin
   conn.modrdn("cn = Zara Ali, dc = localhost, dc = localdomain", "cn = Zara Mohtashim", true)
rescue LDAP::ResultError
   conn.perror("modrdn")
   exit
end
conn.perror("modrdn")
conn.unbind

Arama Yapma

Bir LDAP dizininde arama yapmak için , üç farklı arama modundan biriyle arama yöntemini kullanın -

  • LDAP_SCOPE_BASEM - Yalnızca temel düğümü arayın.

  • LDAP_SCOPE_ONELEVEL - Temel düğümün tüm alt öğelerini arayın.

  • LDAP_SCOPE_SUBTREE - Temel düğüm dahil tüm alt ağacı arayın.

Misal

Burada, kişi nesneleri için dc = localhost, dc = localdomain girişinin tüm alt ağacını arayacağız -

#/usr/bin/ruby -w

require 'ldap'

$HOST =    'localhost'
$PORT = LDAP::LDAP_PORT $SSLPORT = LDAP::LDAPS_PORT

base = 'dc = localhost,dc = localdomain'
scope = LDAP::LDAP_SCOPE_SUBTREE
filter = '(objectclass = person)'
attrs = ['sn', 'cn']

conn = LDAP::Conn.new($HOST, $PORT)
conn.bind('cn = root, dc = localhost, dc = localdomain','secret')

conn.perror("bind")
begin
   conn.search(base, scope, filter, attrs) { |entry|
      # print distinguished name
      p entry.dn
      # print all attribute names
      p entry.attrs
      # print values of attribute 'sn'
      p entry.vals('sn')
      # print entry as Hash
      p entry.to_hash
   }
rescue LDAP::ResultError
   conn.perror("search")
   exit
end
conn.perror("search")
conn.unbind

Bu, LDAP girişinin LDAP :: Entry sınıfının bir örneği tarafından temsil edildiği her eşleşen giriş için verilen kod bloğunu çağırır. Son arama parametresi ile, ilgilendiğiniz öznitelikleri, diğerlerini atlayarak belirtebilirsiniz. Buraya nil geçerseniz, tüm öznitelikler ilişkisel veritabanlarında "SELECT *" olarak döndürülür.

LDAP :: Entry sınıfının dn yöntemi (get_dn için takma ad), girdinin ayırt edici adını döndürür ve to_hash yöntemiyle, özniteliklerinin (ayırt edici ad dahil) bir karma temsilini elde edebilirsiniz. Bir girdinin özniteliklerinin bir listesini almak için, attrs yöntemini kullanın (get_attributes için takma ad). Ayrıca, belirli bir özniteliğin değerlerinin listesini almak için vals yöntemini (get_values ​​için takma ad) kullanın.

Hataları Yönetme

Ruby / LDAP iki farklı istisna sınıfı tanımlar -

  • Bir hata durumunda, yeni, bağlama veya çözme yöntemleri bir LDAP :: Hata istisnası oluşturur.

  • Bir LDAP dizini ekleme, değiştirme, silme veya arama durumunda bir LDAP :: ResultError yükseltin.

Daha fazla okuma

LDAP yöntemleriyle ilgili tüm ayrıntılar için, lütfen LDAP Belgeleri için standart belgelere bakın .

Geleneksel programlar tek bir yürütme iş parçacığına sahiptir , programı oluşturan ifadeler veya talimatlar, program sona erene kadar sırayla yürütülür.

Çok iş parçacıklı bir programın birden fazla yürütme dizisi vardır. Her iş parçacığı içinde ifadeler sırayla yürütülür, ancak evrelerin kendileri örneğin çok çekirdekli bir CPU üzerinde paralel olarak yürütülebilir. Genellikle tek bir CPU makinesinde, birden çok iş parçacığı gerçekte paralel olarak yürütülmez, ancak iş parçacığının yürütülmesini serpiştirerek paralellik simüle edilir.

Ruby, Thread sınıfıyla çok iş parçacıklı programlar yazmayı kolaylaştırır . Ruby iş parçacıkları, kodunuzda eşzamanlılık elde etmenin hafif ve verimli bir yoludur.

Ruby Konuları Oluşturma

Yeni bir iş parçacığı başlatmak için, bir bloğu Thread.new çağrısıyla ilişkilendirmeniz yeterlidir . Bloktaki kodu yürütmek için yeni bir iş parçacığı oluşturulacak ve orijinal iş parçacığı hemen Thread.new'den dönecek ve sonraki deyimle yürütmeye devam edecektir -

# Thread #1 is running here
Thread.new {
   # Thread #2 runs this code
}
# Thread #1 runs this code

Misal

İşte çok iş parçacıklı Ruby programını nasıl kullanabileceğimizi gösteren bir örnek.

#!/usr/bin/ruby

def func1
   i = 0
   while i<=2
      puts "func1 at: #{Time.now}"
      sleep(2)
      i = i+1
   end
end

def func2
   j = 0
   while j<=2
      puts "func2 at: #{Time.now}"
      sleep(1)
      j = j+1
   end
end

puts "Started At #{Time.now}"
t1 = Thread.new{func1()}
t2 = Thread.new{func2()}
t1.join
t2.join
puts "End at #{Time.now}"

Bu, aşağıdaki sonucu verecektir -

Started At Wed May 14 08:21:54 -0700 2008
func1 at: Wed May 14 08:21:54 -0700 2008
func2 at: Wed May 14 08:21:54 -0700 2008
func2 at: Wed May 14 08:21:55 -0700 2008
func1 at: Wed May 14 08:21:56 -0700 2008
func2 at: Wed May 14 08:21:56 -0700 2008
func1 at: Wed May 14 08:21:58 -0700 2008
End at Wed May 14 08:22:00 -0700 2008

İplik Yaşam Döngüsü

Thread.new ile yeni bir konu oluşturulur . Ayrıca Thread.start ve Thread.fork eşanlamlılarını da kullanabilirsiniz .

Oluşturulduktan sonra bir iş parçacığı başlatmaya gerek yoktur, CPU kaynakları kullanılabilir olduğunda otomatik olarak çalışmaya başlar.

Thread sınıfı, çalışırken iş parçacığını sorgulamak ve işlemek için bir dizi yöntem tanımlar. Bir iş parçacığı, Thread.new çağrısıyla ilişkili bloktaki kodu çalıştırır ve ardından çalışmayı durdurur.

Bu bloktaki son ifadenin değeri, evrenin değeridir ve Thread nesnesinin değer yöntemi çağrılarak elde edilebilir . İş parçacığı tamamlanana kadar çalıştıysa, değer hemen iş parçacığının değerini döndürür. Aksi takdirde, değer yöntemi iş parçacığı tamamlanana kadar engeller ve geri dönmez.

Sınıf yöntemi Thread.current , geçerli evreyi temsil eden Thread nesnesini döndürür. Bu, iş parçacığının kendilerini yönetmesine izin verir. Thread.main sınıf yöntemi , ana iş parçacığını temsil eden Thread nesnesini döndürür. Bu, Ruby programı başladığında başlayan ilk yürütme iş parçacığıdır.

Bu iş parçacığının Thread.join yöntemini çağırarak belirli bir iş parçacığının bitmesini bekleyebilirsiniz . Çağıran iş parçacığı, verilen iş parçacığı bitene kadar engellenecektir.

Konular ve İstisnalar

Ana iş parçacığında bir istisna ortaya çıkarsa ve herhangi bir yerde ele alınmazsa, Ruby yorumlayıcısı bir mesaj yazdırır ve çıkar. Ana iş parçacığı dışındaki iş parçacıklarında, işlenmeyen istisnalar iş parçacığının çalışmasının durmasına neden olur.

Bir konu t işlenmemiş bir istisna nedeniyle çıkıyor ve başka bir iş parçacığı st.join veya t.value çağırır , ardından içinde meydana gelen istisnat iplikte yükselir s.

Eğer Thread.abort_on_exception olan sahte , varsayılan durumu, işlenmeyen bir özel durum yalnızca geçerli iş parçacığı öldürür ve her şey çalışmaya devam.

Çıkmak için tercüman neden herhangi dizisindeki herhangi işlenmeyen istisna isterseniz, sınıf yöntemi set Thread.abort_on_exception için gerçek .

t = Thread.new { ... }
t.abort_on_exception = true

Diş Değişkenleri

Bir iş parçacığı, iş parçacığı oluşturulduğunda normalde kapsamda olan tüm değişkenlere erişebilir. Bir iş parçacığının bloğuna yerel değişkenler iş parçacığı için yereldir ve paylaşılmaz.

İş parçacığı sınıfı, iş parçacığı yerel değişkenlerin ada göre oluşturulmasına ve erişilmesine izin veren özel bir düzene sahiptir. Basitçe iş parçacığı nesnesine bir Hash gibi davranırsınız, [] = kullanarak öğelere yazarsınız ve [] kullanarak onları okursunuz.

Bu örnekte, her iş parçacığı, sayım değişkeninin geçerli değerini bir iş parçacığı yerel değişkenine mycount anahtarıyla kaydeder .

#!/usr/bin/ruby

count = 0
arr = []

10.times do |i|
   arr[i] = Thread.new {
      sleep(rand(0)/10.0)
      Thread.current["mycount"] = count
      count += 1
   }
end

arr.each {|t| t.join; print t["mycount"], ", " }
puts "count = #{count}"

Bu, aşağıdaki sonucu verir -

8, 0, 3, 7, 2, 1, 6, 5, 4, 9, count = 10

Ana iş parçacığı, alt iş parçacığının bitmesini bekler ve ardından her biri tarafından yakalanan sayım değerini yazdırır .

Konu Öncelikleri

İş parçacığı zamanlamasını etkileyen ilk faktör iş parçacığı önceliğidir: yüksek öncelikli iş parçacıkları düşük öncelikli iş parçacıklarından önce programlanır. Daha doğrusu, bir iş parçacığı yalnızca çalışmayı bekleyen daha yüksek öncelikli iş parçacığı yoksa CPU zamanı alacaktır.

Öncelik = ve öncelik ile bir Ruby Thread nesnesinin önceliğini ayarlayabilir ve sorgulayabilirsiniz . Yeni oluşturulan bir iş parçacığı, onu oluşturan iş parçacığı ile aynı öncelikte başlar. Ana iş parçacığı 0 önceliğinde başlar.

Çalışmaya başlamadan önce bir iş parçacığının önceliğini ayarlamanın bir yolu yoktur. Bununla birlikte, bir iş parçacığı, yaptığı ilk eylem olarak kendi önceliğini artırabilir veya azaltabilir.

Konu Hariç Tutma

İki iş parçacığı aynı verilere erişimi paylaşırsa ve iş parçacıklarından en az biri bu verileri değiştirirse, hiçbir iş parçacığının tutarsız bir durumda veriyi görmemesini sağlamak için özel dikkat göstermelisiniz. Buna iş parçacığı dışlama denir .

Mutexbazı paylaşılan kaynaklara karşılıklı olarak dışlayıcı erişim için basit bir semafor kilidi uygulayan bir sınıftır. Yani, belirli bir zamanda sadece bir iplik kilidi tutabilir. Diğer iş parçacıkları, kilidin kullanılabilir hale gelmesi için sırada beklemeyi seçebilir veya kilidin mevcut olmadığını belirten anında bir hata almayı seçebilir.

Paylaşılan verilere tüm erişimleri bir muteksin kontrolü altına alarak tutarlılık ve atomik çalışma sağlıyoruz. Örnekleri deneyelim, ilki mutaksız ve ikincisi mutax ile -

Mutax olmadan örnek

#!/usr/bin/ruby
require 'thread'

count1 = count2 = 0
difference = 0
counter = Thread.new do
   loop do
      count1 += 1
      count2 += 1
   end
end
spy = Thread.new do
   loop do
      difference += (count1 - count2).abs
   end
end
sleep 1
puts "count1 :  #{count1}"
puts "count2 :  #{count2}"
puts "difference : #{difference}"

Bu, aşağıdaki sonucu verecektir -

count1 :  1583766
count2 :  1583766
difference : 0
#!/usr/bin/ruby
require 'thread'
mutex = Mutex.new

count1 = count2 = 0
difference = 0
counter = Thread.new do
   loop do
      mutex.synchronize do
         count1 += 1
         count2 += 1
      end
   end
end
spy = Thread.new do
   loop do
      mutex.synchronize do
         difference += (count1 - count2).abs
      end
   end
end
sleep 1
mutex.lock
puts "count1 :  #{count1}"
puts "count2 :  #{count2}"
puts "difference : #{difference}"

Bu, aşağıdaki sonucu verecektir -

count1 :  696591
count2 :  696591
difference : 0

Kilitlenme ile Mücadele

İş parçacığı dışlama için Mutex nesnelerini kullanmaya başladığımızda, kilitlenmeyi önlemek için dikkatli olmalıyız . Kilitlenme, tüm iş parçacığı başka bir iş parçacığı tarafından tutulan bir kaynağı almayı beklediğinde oluşan durumdur. Tüm iş parçacıkları engellendiği için tuttukları kilitleri açamazlar. Ve kilitleri serbest bırakamadıkları için, bu kilitleri başka hiçbir iplik alamaz.

Koşul değişkenleri burada devreye giriyor. Bir koşul değişkeni , basitçe bir kaynakla ilişkili olan ve belirli bir muteksin koruması içinde kullanılan bir semafordur . Kullanılamayan bir kaynağa ihtiyacınız olduğunda, bir koşul değişkenini beklersiniz. Bu eylem, karşılık gelen muteks üzerindeki kilidi kaldırır . Başka bir iş parçacığı kaynağın kullanılabilir olduğunu işaret ettiğinde, orijinal iş parçacığı beklemeden çıkar ve aynı anda kritik bölgedeki kilidi yeniden kazanır.

Misal

#!/usr/bin/ruby
require 'thread'
mutex = Mutex.new

cv = ConditionVariable.new
a = Thread.new {
   mutex.synchronize {
      puts "A: I have critical section, but will wait for cv"
      cv.wait(mutex)
      puts "A: I have critical section again! I rule!"
   }
}

puts "(Later, back at the ranch...)"

b = Thread.new {
   mutex.synchronize {
      puts "B: Now I am critical, but am done with cv"
      cv.signal
      puts "B: I am still critical, finishing up"
   }
}
a.join
b.join

Bu, aşağıdaki sonucu verecektir -

A: I have critical section, but will wait for cv
(Later, back at the ranch...)
B: Now I am critical, but am done with cv
B: I am still critical, finishing up
A: I have critical section again! I rule!

Konu Durumları

Aşağıdaki tabloda gösterildiği gibi beş olası duruma karşılık gelen beş olası dönüş değeri vardır. Durum yöntemi ipliğin durumuna döner.

Konu durumu Geri dönüş değeri
Runnable Çalıştırmak
Uyuyor Uyuyor
İptal iptal
Normal olarak sonlandırıldı yanlış
İstisna ile feshedildi sıfır

İş Parçacığı Sınıf Yöntemleri

Aşağıdaki yöntemler Thread sınıfı tarafından sağlanır ve programda bulunan tüm iş parçacıkları için geçerlidir. Bu yöntemler, aşağıdaki gibi Thread sınıf adı kullanılarak çağrılacaktır -

Thread.abort_on_exception = true
Sr.No. Yöntemler ve Açıklama
1

Thread.abort_on_exception

İstisna durumunda genel durdurmanın durumunu döndürür . Varsayılan yanlıştır . İçin ayarlanan zaman gerçek , iptale kadar bütün konuları neden olur istisna herhangi parçacığı büyüdü ise (proses (0) çıkar)

2

Thread.abort_on_exception=

Ayarlandığında gerçek bir istisna kaldırılırken, tüm ipler iptal edecek. Yeni durumu döndürür.

3

Thread.critical

Global iş parçacığı kritik durumunun durumunu döndürür .

4

Thread.critical=

Global iş parçacığı kritik koşulunun durumunu ayarlar ve döndürür. True olarak ayarlandığında , mevcut herhangi bir iş parçacığının planlanmasını engeller. Yeni iş parçacıklarının oluşturulmasını ve çalıştırılmasını engellemez. Belirli iş parçacığı işlemleri (bir iş parçacığını durdurma veya sonlandırma, geçerli iş parçacığında uyku ve bir özel durum oluşturma gibi) kritik bir bölümde olsa bile iş parçacığının programlanmasına neden olabilir.

5

Thread.current

Yürütülmekte olan iş parçacığını döndürür.

6

Thread.exit

Şu anda çalışan iş parçacığını sonlandırır ve çalıştırılacak başka bir iş parçacığı zamanlar. Bu iş parçacığı zaten öldürülmek üzere işaretlenmişse, çıkış İş Parçacığını döndürür . Bu ana iş parçacığı veya son iş parçacığı ise, işlemden çıkın.

7

Thread.fork { block }

Thread.new ile eşanlamlıdır.

8

Thread.kill( aThread )

Verilen bir İş Parçacığının çıkmasına neden olur

9

Thread.list

Çalıştırılabilir veya durdurulmuş olan tüm evreler için bir Thread nesneleri dizisi döndürür . Konu.

10

Thread.main

İşlem için ana iş parçacığını döndürür.

11

Thread.new( [ arg ]* ) {| args | block }

Blokta verilen talimatları yürütmek için yeni bir iş parçacığı oluşturur ve onu çalıştırmaya başlar. Thread.new'e iletilen herhangi bir argüman bloğa aktarılır.

12

Thread.pass

Yürütmeyi başka bir iş parçacığına iletmek için iş parçacığı zamanlayıcısını çağırır.

13

Thread.start( [ args ]* ) {| args | block }

Temelde Thread.new ile aynı . Bununla birlikte, eğer sınıf İş Parçacığı alt sınıflıysa, o alt sınıfta start çağrısı alt sınıfın başlatma yöntemini çağırmayacaktır .

14

Thread.stop

Mevcut iş parçacığının yürütülmesini durdurur, uyku durumuna geçirir ve başka bir iş parçacığının yürütülmesini zamanlar. Kritik koşulu yanlış olarak sıfırlar .

İş Parçacığı Örneği Yöntemleri

Bu yöntemler, bir iş parçacığı örneğine uygulanabilir. Bu yöntemler, aşağıdaki gibi bir İş Parçacığı örneği kullanılarak çağrılacaktır -

#!/usr/bin/ruby

thr = Thread.new do   # Calling a class method new
   puts "In second thread"
   raise "Raise exception"
end
thr.join   # Calling an instance method join
Sr.No. Yöntemler ve Açıklama
1

thr[ aSymbol ]

Öznitelik Referansı - Bir sembol veya bir Sembol adı kullanarak bir iş parçacığı yerel değişkenin değerini döndürür . Belirtilen değişken yoksa, nil döndürür .

2

thr[ aSymbol ] =

Öznitelik Ataması - Bir sembol veya bir dize kullanarak bir iş parçacığı yerel değişkenin değerini ayarlar veya oluşturur.

3

thr.abort_on_exception

İade durumu istisna üzerine iptale ilişkin koşul etkinliği gösterenlerden . Varsayılan yanlıştır .

4

thr.abort_on_exception=

True olarak ayarlandığında , thr içinde bir istisna ortaya çıkarsa tüm iş parçacıklarının (ana program dahil) iptal edilmesine neden olur . İşlem etkili bir şekilde (0) çıkacaktır .

5

thr.alive?

Thr çalışıyorsa veya uyuyorsa doğru döndürür .

6

thr.exit

Thr'yi sonlandırır ve çalıştırılacak başka bir iş parçacığı zamanlar. Bu iş parçacığı zaten öldürülmek üzere işaretlenmişse, çıkış İş Parçacığını döndürür . Bu ana iş parçacığıysa veya son iş parçacığı ise, işlemden çıkar.

7

thr.join

Çağıran iş parçacığı yürütme askıya alma ve çalışacaktır thr . Thr çıkana kadar geri dönmez . Ana program çıkıldığında, birleştirilmeyen tüm iş parçacıkları öldürülür.

8

thr.key?

Verilen dize (veya sembol) bir evre-yerel değişken olarak mevcutsa doğru döndürür .

9

thr.kill

İçin Eşanlamlı Thread.exit .

10

thr.priority

İade öncelik etkinliği gösterenlerden . Varsayılan sıfırdır; yüksek öncelikli iş parçacıkları, daha düşük öncelikli iş parçacıklarından önce çalışacaktır.

11

thr.priority=

Thr önceliğini bir Tamsayı olarak ayarlar . Daha yüksek öncelikli iş parçacıkları, düşük öncelikli iş parçacıklarından önce çalışacaktır.

12

thr.raise( anException )

Bir istisna Artırdı etkinliği gösterenlerden . Arayan olmak zorunda değildir thr .

13

thr.run

Uyanır thr zamanlama için elverişli hale. Kritik bir bölümde değilse, zamanlayıcıyı çağırır.

14

thr.safe_level

İade için yürürlükte güvenli seviye etkinliği gösterenlerden .

15

thr.status

İade durumu thr : uyku halinde thr uyku ya, I / O bekliyor çalıştırmak eğer thr eğer false yürütülürken thr normalde sonlandırıldı ve nil eğer thr bir istisna ile sonlandırıldı.

16

thr.stop?

İade gerçek olursa thr ölü ya da uyuyor.

17

thr.value

Thr'nin Thread.join aracılığıyla tamamlanmasını bekler ve değerini döndürür.

18

thr.wakeup

İşaretler Thr zamanlama için uygun olarak, yine de, ancak, I / O bloke kalabilir.

Yana Çekirdek modülü tarafından dahildir Nesne sınıfının, onun yöntemlerini Yakut programında her yerde kullanılabilir. Alıcı olmadan çağrılabilirler (işlevsel form). Bu nedenle, genellikle işlevler olarak adlandırılırlar.

Sr.No. Yöntemler ve Açıklama
1

abort

Programı sonlandırır. Bir istisna oluşursa (yani, $! Sıfır değilse), hata mesajı görüntülenir.

2

Array( obj)

To_ary veya to_a kullanarak bir diziye dönüştürdükten sonra obj'i döndürür.

3

at_exit {...}

Program çıktığında yürütülmesi için bir blok kaydeder. END deyimine benzer, ancak END ifadesi bloğu yalnızca bir kez kaydeder.

4

autoload( classname, file)

İlk kullanıldığında dosyadan yüklenecek bir sınıf sınıf adı kaydeder. sınıf adı bir dizge veya sembol olabilir.

5

binding

Geçerli değişkeni ve yöntem bağlamalarını döndürür. Bağlanma döndürülen nesne geçirilebilmektedir Eval ikinci değişken olarak yöntem.

6

block_given?

Yöntem bir blokla çağrıldıysa doğru döndürür .

7

callcc {| c|...}

Bloğa bir Devam nesnesi c iletir ve bloğu yürütür. callcc , genel çıkış veya döngü yapısı için kullanılabilir.

8

caller([ n])

File: line formundaki dizelerden oluşan bir dizide geçerli yürütme yığınını döndürür . Eğer n belirtilmişse, n'inci seviyeden aşağıya yığın girişleri döndürür.

9

catch( tag) {...}

Bloğunun yürütülmesi sırasında çağrılan bir atışla yerel olmayan bir çıkış yakalar.

10

chomp([ rs = $/])

Değişkenin değerini verir $_ with the ending newline removed, assigning the result back to $_. Yeni satır dizesinin değeri rs ile belirtilebilir.

11

chomp!([ rs = $/])

Dizeyi yerinde değiştirerek $ _ 'dan yeni satırı kaldırır.

12

chop

Değerini verir $_ with its last character (one byte) removed, assigning the result back to $_.

13

chop!

Dizeyi yerinde değiştirerek $ _ 'dan son karakteri kaldırır.

14

eval( str[, scope[, file, line]])

Çalıştırır str Yakut kodu olarak. Değerlendirmenin gerçekleştirileceği bağlayıcı kapsam ile belirtilebilir . Kod dosya ve satır numarası kullanılarak belirlenebilir derlenecek dosya ve hat.

15

exec( cmd[, arg...])

Cmd komutunu çalıştırarak mevcut işlemi değiştirir . Birden fazla argüman belirtilirse, komut kabuk genişletmesi olmadan yürütülür.

16

exit([ result = 0])

Durum kodu döndürülen sonuçla birlikte programdan çıkar .

17

exit!([ result = 0])

Taşıma programı bypass exit öldürür gibi sağlamak , vb

18

fail(...)

Yükseltmeye bakın (...)

19

Float( obj)

Şamandıraya dönüştürdükten sonra obj'i döndürür. Sayısal nesneler doğrudan dönüştürülür; nil, 0.0'a dönüştürülür; dizeler 0x, 0b radix öneki dikkate alınarak dönüştürülür. Geri kalanlar obj.to_f kullanılarak dönüştürülür.

20

fork

fork {...}

Bir çocuk süreç yaratır. nil , alt süreçte döndürülür ve alt sürecin kimliği (tamsayı) üst süreçte döndürülür. Bir blok belirtilirse, alt süreçte çalıştırılır.

21

format( fmt[, arg...])

Sprintf bakın.

22

gets([ rs = $/])

Komut satırında belirtilen dosya adını veya standart girişten bir satır okur. Kayıt ayırıcı dizesi açıkça rs ile belirtilebilir.

23

global_variables

Global değişken isimlerinden oluşan bir dizi döndürür.

24

gsub( x, y)

gsub( x) {...}

İçinde x ile eşleşen tüm dizeleri değiştirir $_ with y. If a block is specified, matched strings are replaced with the result of the block. The modified result is assigned to $_.

25

gsub!( x, y)

gsub!( x) {...}

Dizenin yerinde değiştirilmesi dışında gsub ile aynı ikameyi gerçekleştirir.

26

Integer( obj)

Tam sayıya dönüştürdükten sonra obj'i döndürür. Sayısal nesneler doğrudan dönüştürülür; nil, 0'a dönüştürülür; dizeler 0x, 0b radix öneki dikkate alınarak dönüştürülür. Geri kalanlar obj.to_i kullanılarak dönüştürülür.

27

lambda {| x|...}

proc {| x|...}

lambda

proc

Bir bloğu bir Proc nesnesine dönüştürür . Blok belirtilmezse, çağırma yöntemiyle ilişkili blok dönüştürülür.

28

load( file[, private = false])

Bir Ruby programını yükler dosyası . Aksine gerektirir , bu uzantı kütüphaneleri yüklemez. Eğer özel bir gerçek , program, böylece çağıran programının ad koruyarak anonim modül yüklenir.

29

local_variables

Yerel değişken isimlerinden oluşan bir dizi döndürür.

30

loop {...}

Bir kod bloğunu tekrar eder.

31

open( path[, mode = "r"])

open( path[, mode = "r"]) {| f|...}

Bir dosya açar . Bir blok belirtilirse, blok argüman olarak iletilen açık akımla yürütülür. Blok çıktığında dosya otomatik olarak kapatılır. Eğer yolu bir boru ile başlar | aşağıdaki dize komut olarak çalıştırılan ve bu işlemle ilişkili akışı döndürülür.

32

p( obj)

Objeyi inspect yöntemini kullanarak görüntüler (genellikle hata ayıklama için kullanılır).

33

print([ arg...])

Baskılar $ defout için argüman . Hiçbir bağımsız değişken belirtilmezse, $ _ değeri yazdırılır.

34

printf( fmt[, arg...])

Biçimleri göre ARG FMT kullanarak sprintf'i ve sonucu yazdırır $ defout . Biçimlendirme özellikleri için ayrıntılar için sprintf'e bakın.

35

proc {| x|...}

proc

Lamda'ya bakın.

36

putc( c)

Varsayılan çıktıya bir karakter yazdırır ( $ defout ).

37

puts([ str])

Dizeyi varsayılan çıktıya yazdırır ( $ defout ). Dize bir satırsonu ile bitmiyorsa, dizeye bir satırsonu eklenir.

38

raise(...)

fail(...)

Bir istisna oluşturur. Herhangi bir istisna sınıfı belirtilmezse RuntimeError değerini varsayar . Bir kurtarma cümlesinde argümansız zam çağırmak istisnayı yeniden yükseltir. Bunu bir kurtarma yan tümcesi dışında yapmak, mesajsız bir RuntimeError hatası oluşturur .fail zam için kullanılmayan bir isimdir.

39

rand([ max = 0])

0'a eşit veya 0'dan büyük ve maks'dan küçük bir sözde rastgele sayı üretir. Max belirtilmezse veya 0'a ayarlanırsa, rasgele bir sayı, 0'a eşit veya 0'dan büyük ve 1'den küçük bir kayan nokta sayısı olarak döndürülür. Srand , sözde rasgele akışı başlatmak için kullanılabilir.

40

readline([ rs = $/])

EOF okumada bir EOFError istisnası ortaya çıkarması dışında, gets'a eşdeğerdir.

41

readlines([ rs = $/])

Komut satırı bağımsız değişkenleri olarak belirtilen dosya adlarını veya standart girdinin içeriğini tutan bir dizi dizisi döndürür.

42

require( lib)

Yükler (uzatma kütüphaneleri dahil) kütüphane lib ilk denir zaman. required aynı kitaplığı birden fazla yüklemeyecektir. Hiçbir uzantı belirtilirse lib , kendisine vb .bu, .rb eklemek için çalışır gerektirir.

43

scan( re)

scan( re) {|x|...}

$ _. Scan ile eşdeğerdir.

44

select( reads[, writes = nil[, excepts = nil[, timeout = nil]]])

GÇ nesnelerinin dizileri olarak iletilen üç tür GÇ nesnesi girişi, çıkışı ve istisnasının durumundaki değişiklikleri denetler. nil , kontrol edilmesi gerekmeyen argümanlar için geçirilir. Durumunda değişiklikler olan GÇ nesnelerinin dizilerini içeren üç öğeli bir dizi döndürülür. nil zaman aşımına uğradığında döndürülür.

45

set_trace_func( proc)

İzleme için bir işleyici ayarlar. proc bir dizge veya proc nesnesi olabilir. set_trace_func , hata ayıklayıcı ve profil oluşturucu tarafından kullanılır.

46

sleep([ sec])

Programın yürütülmesini saniye saniye askıya alır. Sn belirtilmezse, program sonsuza kadar askıya alınır.

47

split([ sep[, max]])

$ _. Split'e eşdeğerdir.

48

sprintf( fmt[, arg...])

format( fmt[, arg...])

Arg'nin fmt'ye göre biçimlendirildiği bir dize döndürür. Biçimlendirme spesifikasyonları esasen C programlama dilinde sprintf için olanlarla aynıdır. Fmt'deki dönüşüm tanımlayıcıları (% ve ardından dönüşüm alanı tanımlayıcısı ) , karşılık gelen bağımsız değişkenin biçimlendirilmiş dizesiyle değiştirilir. Dosyalanan dönüşüm listesi aşağıda bir sonraki bölümde verilmiştir.

49

srand([ seed])

Bir rastgele sayı dizisini başlatır. Eğer tohum belirtilmemişse, başlatma zamanı ve tohum için diğer sistem bilgilerini kullanarak gerçekleştirilir.

50

String( obj)

Obj.to_s kullanarak onu bir dizeye dönüştürdükten sonra obj'i döndürür.

51

syscall( sys[, arg...])

Number sys ile belirtilen bir işletim sistemi çağrı işlevini çağırır . Sys'nin sayıları ve anlamı sisteme bağlıdır.

52

system( cmd[, arg...])

Çalıştırır cmd komut satırına çağrısı olarak. Birden fazla argüman belirtilirse, komut kabuk genişletmesi olmadan doğrudan çalıştırılır. Dönüş durumu 0 ise (başarılı) doğru döndürür .

53

sub( x, y)

sub( x) {...}

$ _ İçindeki x ile eşleşen ilk dizeyi y ile değiştirir. Bir blok belirtilirse, eşleşen dizeler bloğun sonucuyla değiştirilir. Değiştirilen sonuç $ _'a atanır.

54

sub!( x, y)

sub!( x) {...}

Dizenin yerinde değiştirilmesi dışında sub ile aynı değişimi gerçekleştirir.

55

test( test, f1[, f2])

Karakter testi tarafından belirtilen çeşitli dosya testlerini gerçekleştirir . Okunabilirliği iyileştirmek için, bu işlev yerine File sınıfı yöntemlerini (örneğin File :: readable?) Kullanmalısınız. Bir sonraki bölümde argümanların bir listesi aşağıda verilmiştir.

56

throw( tag[, value = nil])

Sembol veya dizge etiketiyle bekleyen catch işlevine atlar . değer, catch tarafından kullanılacak dönüş değeridir .

57

trace_var( var, cmd)

trace_var( var) {...}

Global bir değişken için izlemeyi ayarlar. Değişken adı bir sembol olarak belirtilir. cmd bir dize veya Proc nesnesi olabilir.

58

trap( sig, cmd)

trap( sig) {...}

Bir sinyal işleyici ayarlar. sig bir dize (SIGUSR1 gibi) veya bir tam sayı olabilir. SIG, sinyal adından çıkarılabilir. EXIT sinyali için sinyal işleyici veya sinyal numarası 0, işlemin sonlandırılmasından hemen önce çağrılır.

59

untrace_var( var[, cmd])

Global değişken için izlemeyi kaldırır. Eğer cmd belirtilirse, yalnızca bu komut kaldırılır.

Sayılar için İşlevler

Numarayla ilgili Yerleşik İşlevlerin listesi aşağıdadır. Aşağıdaki gibi kullanılmalıdır -

#!/usr/bin/ruby

num = 12.40
puts num.floor      # 12
puts num + 10       # 22.40
puts num.integer?   # false  as num is a float.

Bu, aşağıdaki sonucu verecektir -

12
22.4
false
Sr.No. Yöntemler ve Açıklama
1

n + num

n - num

n * num

n / num

Aritmetik işlemler gerçekleştirir: toplama, çıkarma, çarpma ve bölme.

2

n % num

N modülünü verir.

3

n ** num

Üs alma.

4

n.abs

N'nin mutlak değerini döndürür.

5

n.ceil

N'den büyük veya n'ye eşit en küçük tamsayıyı döndürür.

6

n.coerce( num)

Her ikisi de muhtemelen karşılıklı olarak çalıştırılmalarına izin veren bir türe dönüştürülmüş num ve n içeren bir dizi döndürür. Sayısal operatörlerde otomatik tür dönüştürmede kullanılır.

7

n.divmod( num)

N'nin num'a bölünmesinden elde edilen bölümü ve modülü içeren bir dizi döndürür.

8

n.floor

N'den küçük veya n'ye eşit en büyük tamsayıyı döndürür.

9

n.integer?

N bir tamsayı ise doğru döndürür.

10

n.modulo( num)

N'nin sayıya bölünmesi ve bölümün floor ile yuvarlanmasıyla elde edilen modülü verir

11

n.nonzero?

Sıfır değilse n, aksi takdirde nil döndürür.

12

n.remainder( num)

Bölünerek elde edilen kalanı verir n tarafından numve ondalık sayıları bölümden çıkarma. result ve n hep aynı işaret var.

13

n.round

Returns n rounded to the nearest integer.

14

n.truncate

Returns n as an integer with decimals removed.

15

n.zero?

Returns zero if n is 0.

16

n & num

n | num

n ^ num

Bitwise operations: AND, OR, XOR, and inversion.

17

n << num

n >> num

Bitwise left shift and right shift.

18

n[num]

Returns the value of the numth bit from the least significant bit, which is n[0].

19

n.chr

Returns a string containing the character for the character code n.

20

n.next

n.succ

Returns the next integer following n. Equivalent to n + 1.

21

n.size

Returns the number of bytes in the machine representation of n.

22

n.step( upto, step) {|n| ...}

Iterates the block from n to upto, incrementing by step each time.

23

n.times {|n| ...}

Iterates the block n times.

24

n.to_f

Converts n into a floating point number. Float conversion may lose precision information.

25

n.to_int

Returns n after converting into interger number.

Functions for Float

Sr.No. Methods & Description
1

Float::induced_from(num)

Returns the result of converting num to a floating-point number.

2

f.finite?

Returns true if f isn't infinite and f.nan is false.

3

f.infinite?

Returns 1 if f is positive infinity, -1 if negative infinity, or nil if anything else.

4

f.nan?

Returns true if f isn't a valid IEEE floating point number.

Functions for Math

Sr.No. Methods & Description
1

atan2( x, y)

Calculates the arc tangent.

2

cos( x)

Calculates the cosine of x.

3

exp( x)

Calculates an exponential function (e raised to the power of x).

4

frexp( x)

Returns a two-element array containing the nominalized fraction and exponent of x.

5

ldexp( x, exp)

Returns the value of x times 2 to the power of exp.

6

log( x)

Calculates the natural logarithm of x.

7

log10( x)

Calculates the base 10 logarithm of x.

8

sin( x)

Calculates the sine of x.

9

sqrt( x)

Returns the square root of x. x must be positive.

10

tan( x)

Calculates the tangent of x.

Conversion Field Specifier

The function sprintf( fmt[, arg...]) and format( fmt[, arg...]) returns a string in which arg is formatted according to fmt. Formatting specifications are essentially the same as those for sprintf in the C programming language. Conversion specifiers (% followed by conversion field specifier) in fmt are replaced by formatted string of corresponding argument.

Sr.No. Specifier & Description
1

b

Binary integer

2

c

Single character

3

d,i

Decimal integer

4

e

Exponential notation (e.g., 2.44e6)

5

E

Exponential notation (e.g., 2.44E6)

6

f

Floating-point number (e.g., 2.44)

7

g

use %e if exponent is less than -4, %f otherwise

8

G

use %E if exponent is less than -4, %f otherwise

9

o

Octal integer

10

s

String or any object converted using to_s

11

u

Unsigned decimal integer

12.

x

Hexadecimal integer (e.g., 39ff)

13

X

Hexadecimal integer (e.g., 39FF)

Following is the usage example −

#!/usr/bin/ruby

str = sprintf("%s\n", "abc")   # => "abc\n" (simplest form)
puts str 

str = sprintf("d=%d", 42)      # => "d=42" (decimal output)
puts str 

str = sprintf("%04x", 255)     # => "00ff" (width 4, zero padded)
puts str 

str = sprintf("%8s", "hello")  # => " hello" (space padded)
puts str 

str = sprintf("%.2s", "hello") # => "he" (trimmed by precision)
puts str

This will produce the following result −

abc
d = 42
00ff
   hello
he

Test Function Arguments

The function test( test, f1[, f2]) performs one of the following file tests specified by the character test. In order to improve readability, you should use File class methods (for example, File::readable?) rather than this function.

Sr.No. Argument & Description
1

?r

Is f1 readable by the effective uid of caller?

2

?w

Is f1 writable by the effective uid of caller?

3

?x

Is f1 executable by the effective uid of caller?

4

?o

Is f1 owned by the effective uid of caller?

5

?R

Is f1 readable by the real uid of caller?

6

?W

Is f1 writable by the real uid of caller?

7

?X

Is f1 executable by the real uid of caller?

8

?O

Is f1 owned by the real uid of caller?

9

?e

Does f1 exist?

10

?z

Does f1 have zero length?

11

?s

File size of f1(nil if 0)

12

?f

Is f1 a regular file?

13

?d

Is f1 a directory?

14

?l

Is f1 a symbolic link?

15

?p

Is f1 a named pipe (FIFO)?

16

?S

Is f1 a socket?

17

?b

Is f1 a block device?

18

?c

Is f1 a character device?

19

?u

Does f1 have the setuid bit set?

20

?g

Does f1 have the setgid bit set?

21

?k

Does f1 have the sticky bit set?

22

?M

Last modification time for f1.

23

?A

Last access time for f1.

24

?C

Last inode change time for f1.

Sr.No. Argument & Description
1

?=

Are modification times of f1 and f2 equal?

2

?>

Is the modification time of f1 more recent than f2 ?

3

?<

Is the modification time of f1 older than f2 ?

4

?-

Is f1 a hard link to f2 ?

Following is the usage example. Assuming main.rb exist with read, write and not execute permissions −

#!/usr/bin/ruby

puts test(?r, "main.rb" )   # => true
puts test(?w, "main.rb" )   # => true
puts test(?x, "main.rb" )   # => false

This will produce the following result −

true
false
false

Ruby - Predefined Variables

Ruby's predefined variables affect the behavior of the entire program, so their use in libraries is not recommended.

The values in most predefined variables can be accessed by alternative means.

Following table lists all the Ruby's predefined variables.

Sr.No. Variable Name & Description
1

$!

The last exception object raised. The exception object can also be accessed using => in rescue clause.

2

$@

The stack backtrace for the last exception raised. The stack backtrace information can retrieved by Exception#backtrace method of the last exception.

3

$/

The input record separator (newline by default). gets, readline, etc., take their input record separator as optional argument.

4

$\

The output record separator (nil by default).

5

$,

The output separator between the arguments to print and Array#join (nil by default). You can specify separator explicitly to Array#join.

6

$;

The default separator for split (nil by default). You can specify separator explicitly for String#split.

7

$.

The number of the last line read from the current input file. Equivalent to ARGF.lineno.

8

$<

Synonym for ARGF.

9

$>

Synonym for $defout.

10

$0

The name of the current Ruby program being executed.

11

$$

The process pid of the current Ruby program being executed.

12

$?

The exit status of the last process terminated.

13

$:

Synonym for $LOAD_PATH.

14

$DEBUG

True if the -d or --debug command-line option is specified.

15

$defout

The destination output for print and printf ($stdout by default).

16

$F

The variable that receives the output from split when -a is specified. This variable is set if the -a command-line option is specified along with the -p or -n option.

17

$FILENAME

The name of the file currently being read from ARGF. Equivalent to ARGF.filename.

18

$LOAD_PATH

An array holding the directories to be searched when loading files with the load and require methods.

19

$SAFE

The security level

0 → No checks are performed on externally supplied (tainted) data. (default)

1 → Potentially dangerous operations using tainted data are forbidden.

2 → Potentially dangerous operations on processes and files are forbidden.

3 → All newly created objects are considered tainted.

4 → Modification of global data is forbidden.

20

$stdin

Standard input (STDIN by default).

21

$stdout

Standard output (STDOUT by default).

22

$stderr

Standard error (STDERR by default).

23

$VERBOSE

True if the -v, -w, or --verbose command-line option is specified.

24

$- x

The value of interpreter option -x (x=0, a, d, F, i, K, l, p, v). These options are listed below

25

$-0

The value of interpreter option -x and alias of $/.

26

$-a

The value of interpreter option -x and true if option -a is set. Read-only.

27

$-d

The value of interpreter option -x and alias of $DEBUG

28

$-F

The value of interpreter option -x and alias of $;.

29

$-i

The value of interpreter option -x and in in-place-edit mode, holds the extension, otherwise nil. Can enable or disable in-place-edit mode.

30

$-I

The value of interpreter option -x and alias of $:.

31

$-l

The value of interpreter option -x and true if option -lis set. Read-only.

32

$-p

The value of interpreter option -x and true if option -pis set. Read-only.

33

$_

The local variable, last string read by gets or readline in the current scope.

34

$~

The local variable, MatchData relating to the last match. Regex#match method returns the last match information.

35

$ n ($1, $2, $3...)

The string matched in the nth group of the last pattern match. Equivalent to m[n], where m is a MatchData object.

36

$&

The string matched in the last pattern match. Equivalent to m[0], where m is a MatchData object.

37

$`

The string preceding the match in the last pattern match. Equivalent to m.pre_match, where m is a MatchData object.

38

$'

The string following the match in the last pattern match. Equivalent to m.post_match, where m is a MatchData object.

39

$+

The string corresponding to the last successfully matched group in the last pattern match.

Ruby - Predefined Constants

The following table lists all the Ruby's Predefined Constants −

NOTE − TRUE, FALSE, and NIL are backward-compatible. It's preferable to use true, false, and nil.

Sr.No. Constant Name & Description
1

TRUE

Synonym for true.

2

FALSE

Synonym for false.

3

NIL

Synonym for nil.

4

ARGF

An object providing access to virtual concatenation of files passed as command-line arguments or standard input if there are no command-line arguments. A synonym for $<.

5

ARGV

An array containing the command-line arguments passed to the program. A synonym for $*.

6

DATA

An input stream for reading the lines of code following the __END__ directive. Not defined if __END__ isn't present in code.

7

ENV

A hash-like object containing the program's environment variables. ENV can be handled as a hash.

8

RUBY_PLATFORM

A string indicating the platform of the Ruby interpreter.

9

RUBY_RELEASE_DATE

A string indicating the release date of the Ruby interpreter

10

RUBY_VERSION

A string indicating the version of the Ruby interpreter.

11

STDERR

Standard error output stream. Default value of $stderr.

12

STDIN

Standard input stream. Default value of $stdin.

13

STDOUT

Standard output stream. Default value of $stdout.

14

TOPLEVEL_BINDING

A binding object at Ruby's top level.

Ruby - Associated Tools

Standard Ruby Tools

The standard Ruby distribution contains useful tools along with the interpreter and standard libraries −

These tools help you debug and improve your Ruby programs without spending much effort. This tutorial will give you a very good start with these tools.

  • RubyGems −

    RubyGems is a package utility for Ruby, which installs Ruby software packages and keeps them up-to-date.

  • Ruby Debugger −

    To help deal with bugs, the standard distribution of Ruby includes a debugger. This is very similar to gdb utility, which can be used to debug complex programs.

  • Interactive Ruby (irb) −

    irb (Interactive Ruby) was developed by Keiju Ishitsuka. It allows you to enter commands at the prompt and have the interpreter respond as if you were executing a program. irb is useful to experiment with or to explore Ruby.

  • Ruby Profiler −

    Ruby profiler helps you to improve the performance of a slow program by finding the bottleneck.

Additional Ruby Tools

There are other useful tools that don't come bundled with the Ruby standard distribution. However, you do need to install them yourself.

  • eRuby: Embeded Ruby −

    eRuby stands for embedded Ruby. It's a tool that embeds fragments of Ruby code in other files, such as HTML files similar to ASP, JSP and PHP.

  • ri: Ruby Interactive Reference −

    When you have a question about the behavior of a certain method, you can invoke ri to read the brief explanation of the method.

For more information on Ruby tool and resources, have a look at Ruby Useful Resources.