在PHP中,您可以使两个变量指向相同的数据。
$a = 'foo';
$b = 'bar';
$a =& $b;
echo $a // Outputs: bar
echo $b // Outputs: bar
我们在Ruby中尝试做的是将@app_session
设置为等于session[@current_app[:uid]]
。因此,我们只需在应用中处理@app_session
,所有内容都会自动保存到会话中。
有没有办法在Ruby中执行此操作?经过15分钟的阅读,谷歌搜索,并在办公室询问,我们仍然迷路了......哈哈
答案 0 :(得分:7)
Ruby中的所有变量都是对象的引用。
a = b
表示a和b指向同一个对象。这就是为什么当你想复制一个给定的对象时,你需要写
a = b.dup
书写
@app_session = session[@current_app[:uid]]
指向同一个物体,所以你应该没事。
编辑:您可以这样验证:
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
答案 1 :(得分:3)
变量和常量是指向内存位置的指针。 Ruby通过defaut执行此操作,因此您无需手动“模拟”PVP行为。证据:
a = "hi"
b = a
a.upcase!
puts a
# => "HI"
puts b
# => "HI"
至于你的@app_session
问题,我会做这样的事情:
class ApplicationController < ActionController::Base
def app_session
session[@current_app[:uid]]
end
end
这使您可以调用方法'app_session',以便稍后可以轻松更改实现。 (比方说,如果你发现你需要使用常量而不是实例变量,或者其他什么。)
答案 2 :(得分:2)
同意leethal和Keltia。只需要指出一点:
当您为变量指定一些字符串时,您总是通过这样做来创建一个新的String对象。
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"
答案 3 :(得分:1)
这不是所有ruby对象的默认值吗?每次复制一个对象是没有意义的。