PHP gibi Ruby desteği var referansları mu?

4 Cevap php

PHP, iki değişken aynı verilere işaret yapabilirsiniz.

$a = 'foo';
$b = 'bar';
$a =& $b;
echo $a // Outputs: bar
echo $b // Outputs: bar

Ne Ruby yapmaya çalışıyoruz @app_session session[@current_app[:uid]] eşit olacak şekilde ayarlanır. Yani biz sadece bizim app @app_session ile uğraşmak zorunda, ve her şey otomatik oturuma kaydedilir.

Ruby bunu yapmanın bir yolu var mı? , Okuma googling ve ofiste buralarda soran 15 dakika sonra, biz hala lol ... Kaybolduk

4 Cevap

Ruby tüm değişkenler bir nesneye referanslar vardır.

a = b

anlamı aynı nesneye ki a ve b noktası. Eğer belirli bir nesneyi kopyalamak istediğinizde, size yazmak gerekir bu yüzden

a = b.dup

Yazı

@app_session = session[@current_app[:uid]]

ince olmalıdır böylece aynı nesneye işaret.

EDIT: Eğer bu şekilde doğrulayabilirsiniz:

irb(main):001:0> a = 1
=> 1
irb(main):002:0> b = a
=> 1
irb(main):004:0> p a.object_id
3
=> nil
irb(main):005:0> p b.object_id
3

Değişkenler ve sabitler hafıza yerlere göstericisidir. Ruby Defaut yapar, bu nedenle elle PVP davranışı "taklit" zorunda değilsiniz. Kanıt:

a = "hi"
b = a
a.upcase!
puts a
# => "HI"
puts b
# => "HI"

Lütfen @app_session soruya gelince, ben böyle bir şey yapmak istiyorum:

class ApplicationController < ActionController::Base
  def app_session
    session[@current_app[:uid]]
  end
end

Bu daha sonra kolayca uygulanmasını değiştirebilir, böylece yöntemi 'app_session' diyoruz sağlar. (Say, öğrenmek eğer bir yerine bir örnek değişkeni sabit, ya da her neyse kullanmanız gerekir.)

Leethal ve Keltia katılıyorum. Işaret Sadece bir şey:

Eğer bir değişkene bazı dize atadığınızda, DAİMA bunu yaparak, yeni bir String nesnesi oluşturun.

a = "foo"  # Create a new String object and make a refer this object.
b = "bar"  # Create a new String object and make b refer this object.
a = b      # Make b refer the object created in the first step.
a = "blah" # Create a new String object and make a refer this object. (!)
puts b     # But(!) b is still "foo", because it still refers the "foo" object.
# => "foo"

Bu tüm yakut nesneler için varsayılan değil mi? Bir nesneyi her zaman kopyalamak için mantıklı olmaz.