Ruby/Operatörler

Operatörler değiştir

1. Atamalar değiştir

Ruby'de atamalar eşit işlemcisi "=" kullanılarak yapılır. Bu nesnelerde de değişkenlerde de böyledir, çünkü Ruby'de stringler, floatlar, integerlar hepsi nesnedir ve siz her zaman nesnelere atama yaparsınız.

Örnekler:

  myvar = 'myvar değişkeni şimdi bu string'
  var = 321
  dbconn = Mysql::new('localhost','root','password')

Kendine Atamalar

 x = 1           #=>1
 x += x          #=>2
 x -= x          #=>0
 x += 4          #=>x 0 ise x= + 4 # x değeri 4 olur
 x *= x          #=>16
 x **= x         #=>18446744073709551616 # 16 üssü 16
 x /= x          #=>1

C ve C++ bilenlerden sık gelen bir soru "Bir değişkenin artırım ve azaltımı nasıl yapılacak? ++ ve -- işlemleri nasıl yapılır?" Ruby'de x+=1 artırma için x-=1 azaltım için kullanılır.

 x = 'a'
 x.succ!         #=>"b" : succ! metodu String için tanımlanmıştır ama sayılarda yoktur.

Çoklu Atamalar

Örnekler:

 var1, var2, var3 = 10, 20, 30
 puts var1           #=>var1 değeri 10
 puts var2           #=>var2 değeri 20,var3...etc
 
 myArray=%w(John Michel Fran Adolf) # %w() array tanımlamayı kolaylaştırmak için kullanılır
 var1,var2,var3,var4=*myArray
 puts var1           #=>John
 puts var4           #=>Adolf
 isimler,okul=myArray,'Sen Bernar'
 isimler               #=>["John", "Michel", "Fran", "Adolf"]
 okul              #=>"Sen Bernar"

Koşullu Atama

 x = nil #=>nil
 x ||= "default"      #=>"default" : x nil veya false değerdeyse "default" değerini alacaktır
 x ||= "other"        #=>"default" : x değeri artık nil veya false olmadığı için değişmeyecektir

||= operatörü aşağıdakinin kısaltılmışıdır:

x = x || "default"

||= operatörü şu kodun kısaltılmışı olarak kullanılabilir:

 x = "default" if x.nil?

Bakışlar (Scope) değiştir

Ruby'de temel olarak yerel bakış, genel bakış, ve sınıfsal bakış olarak değişkenler işlenir.

Örnek:

 var=2
 4.times do |x| puts x=x*var end  #=>0,2,4,6
 puts x #=>undefined local variable or method `x' for main:Object (NameError)

Bu hata oluşur çünkü ikinci satırdaki x(üst seviye) do..end bloğu içindeki x(yerel) ile aynı değildir. Yerel x blok içinde tanımlanmış bir değişkendir bu yüzden biz blok dışında x değişkeni çağırdığımızda Ruby tanımadığını belirtecektir.

 4.times do |$global| $global=$global*var end  #=>0,2,4,6 $global değişkenine yapılan son atama 6
 puts $global

Bu çalışır çünkü bir değişken adının önüne dolar işareti koymak onu global yapar. Global değişkenleri az kulanıp bu tip yerlerde :

 4.times do |@instvar| @instvar=@instvar*var end  #=>0,2,4,6 @instvar değişkenine yapılan son atama 6
 puts @instvar

@instance_variable, neyin değişkenidir? En üst seviyenin yani 'Main' sınıfının bu oturum için oluşumuna aittir. Bu da $variable gibi global bir etki yapar. Oluşum değişkenleri bir sınıfın oluşumu içinde kullanılır. Yukardaki örnekte sınıf oluşumu tanımlamasını görmüyoruz ama normalde Ruby'de herhangi bir sınıf içinde yazılmayan her kod aslında 'Main' sınıfı denen ana bir sınıf oluşumu içinde çalışır.

 class Test
   def initialize(arg1='kiwi')
     @instvar=arg1
     @@classvar=@instvar+' size cevap veriyor!!'
     localvar=@instvar
   end
   def print_instvar
     puts @instvar
   end
   def print_localvar
     puts @@classvar
     puts localvar
   end
 end
 class SubTest < Test
   def print_classvar
     puts @@classvar
   end
 end
 var=Test.new
 var.print_instvar              #=>"kiwi", bu çalışır çünkü @instvar değişkenine tüm sınıf içinde ulaşılabilir
 var.print_localvar             #=>undefined local variable or method `localvar' for #<Test:0x2b36208 @instvar="kiwi"> (NameError).

Burda önce "kiwi size cevap veriyor!!" yazar sonra çakılır. 'localvar' adındaki değişkeni tanımadığını belirten bir mesaj verir. (NameError). Neden? çünkü 'print_localvar' metodunun tanımı içinde 'localvar' değişkeni tanımlanmamıştır. Sınıfın 'initialize' metodunun tanımında 'localvar' tanıtılmıştır fakat bu tanım içinde yerel değişken olduğundan diğer metod tanımlamaları ona ulaşamaz. Diğer yandan sınıf değişkenleri '@@classvar' ve '@instvar' tüm sınıf içinde erişilebilir. @@classvar sınıf değişkeni bu sınıftan türetilen diğer sınıflara bile ulaşır.

 class SubSubTest < Test
   def print_classvar
     puts @@classvar
   end
   def modify_classvar
     @@classvar='kiwi kiwi waaai!!'
   end
 end
 newvar=SubTest.new              #newvar üretildi ve Test sınıfının bir oluşumu olarak aynı değere sahip bir @@classvar içeriyor!!
 newvar.print_classvar           #=>kiwi size cevap veriyor!! 

Sınıf değişkenleri sınıf ve altsınıflarında görülür. Bu değişkenler altsınıfa geçtikleri gibi altsınıfın hareketlerinden de etkilenirler ;-)

 subtest=SubSubTest.new          
 subtest.modify_classvar          #bu metod kendisinde değil ana sınıfta tanımlanmış bir değişkenin(@@classvar) değerini değiştiriyor.
 subtest.print_classvar           #=>kiwi kiwi waaai!! 

Test sınıfının bu altsınıfı aynı zamanda newvar isimli diğer altsınıf içindeki @@classvar değişkenini de değiştirdi. Bu da bize sınıf değişkeninin tüm altsınıflarda ortak kullanıldığını gösteriyor.

 newvar.print_classvar           #=>kiwi kiwi waaai!! 

Mantıksal Ve İşlemi değiştir

"and" işlemi verilen iki operandın mantıksal ve işleminin sonucunu verir. "&&" işlemi ile aynı sonucu verir.

Örnek:

a = 1
b = 2
c = nil
puts "tüm argümanlarım true" if a and b
puts "olamaz argümanların biri false" if a and c

Mantıksal Veya İşlemi değiştir

"or" işlemi verilen iki operandın mantıksal veya işleminin sonucunu verir. "||" işlemi ile aynı sonucu verir. Örnek:

a = nil
b = "foo"
c = a || b  # c "foo" değerini alır c = (a || b) ile aynı işlemdir.
c = a or b  # c nil değeri alır (c = a) || b ile aynı işlemdir yani sizin tahmin ettiğiniz şey değil.