![]() Önceki |
![]() İçindekiler |
![]() Sonraki |
| Ruby Kullanıcı Kılavuzu | Yerel Değişkenler |
Yerel değişkenler küçük harfle ya da _ karakteriyle başlayan isimlere sahiptirler. Yerel değişkenler globallerde ya da örnek değişkenlerde olduğu gibi, başlangıçta nil değerine sahip değildirler.
ruby> $foo nil ruby> @foo nil ruby> foo ERR: (eval):1: undefined local variable or method `foo' for main(Object) |
Yerel bir değişkene yaptığınız ilk atama onu tanımlamakla aynı şeydir. Eğer başlangıç değeri olmayan bir yerel değişkene başvurursanız, Ruby yorumlayıcısı bunun bir metodu çalıştırma girişimi olduğunu düşünür ve aşağıdaki gibi bir hata verir.
Genelde yerel bir değişkenin kapsamı aşağıdakilerden biridir:
proc{ ... }loop{ ... }def ... endclass ... endmodule ... endAşağıdaki örnekte görülen defined? operatörü bir tanıtıcının tanımlanıp tanımlanmadığını kontrol eder. Eğer tanımlanmışsa bir açıklama döndürür; tanımlanmamış ise nil değerini döndürür. Gördüğünüz gibi bar döngüde yerel, döngüden çıkınca tanımsızdır.
ruby> foo = 44; print foo, "\n"; defined? foo
44
"local-variable"
ruby> loop{bar=45; print bar, "\n"; break}; defined? bar
45
nil |
Aynı alandaki prosedür nesneleri her ne varsa yine aynı alandaki yerel değişkenlerle paylaşır. Örnekte yerel değişken bar, main ve prosedür nesneleri p1 ve p2 tarafından paylaşılır:
ruby> bar=0
0
ruby> p1 = proc{|n| bar=n}
#<Proc:0x8deb0>
ruby> p2 = proc{bar}
#<Proc:0x8dce8>
ruby> p1.call(5)
5
ruby> bar
5
ruby> p2.call
5 |
Baştaki "bar=0"'ın çıkarılamayacağına dikkat edin; bu atama bar'ın p1 ve p2 tarafından kuşatılacağını garanti eder. Öteki türlü, p1 ve p2 kendi yerel bar değişkenlerini sonlandırır ve p2'yi çağırmak "undefined local variable or method" hatasına neden olabilir.
Prosedürlerin argüman olarak geçilebilmesinin yanında başka bir güçlü özellikleri de paylaşılan yerel değişkenlerin eğer geçildilerse hala geçerli kalmalarıdır.
ruby> def box
| İçindekiler = 15
| get = proc{İçindekiler}
| set = proc{|n| İçindekiler = n}
| return get, set
| end
nil
ruby> reader, writer = box
[#<Proc:0x40170fc0>, #<Proc:0x40170fac>]
ruby> reader.call
15
ruby> writer.call(2)
2
ruby> reader.call
2 |
Ruby kapsam (scope) konusunda bir parça akıllıca davranır. Örneğimizde contents değişkeninin reader ve writer tarafından paylaşılıyordu. Aynı zamanda yukarıda tanımladığımız kutumuzdan birden çok reader-writer çiftleri oluşturabilir ve her çiftin aynı sabiti paylaşmasını sağlayabiliriz.
ruby> reader_1, writer_1 = box [#<Proc:0x40172820>, #<Proc:0x4017280c>] ruby> reader_2, writer_2 = box [#<Proc:0x40172668>, #<Proc:0x40172654>] ruby> writer_1.call(99) 99 ruby> reader_1.call 99 ruby> reader_2.call 15 |
![]() Önceki |
![]() İçindekiler |
![]() Sonraki |