Project1

标题: 请问下这个"@A=@B=true"是什么意思呢? [打印本页]

作者: taeckle    时间: 2022-2-7 04:41
标题: 请问下这个"@A=@B=true"是什么意思呢?
这种写法我还是第一次遇到...难道就是把类变量@A和类变量@B全都赋值为true的意思嘛?
作者: alexncf125    时间: 2022-2-7 09:15
这种问题有什么好提出的??
自己试一次不就一清二楚了

https://runrb.io/
作者: 哇哇哇啊叭叭    时间: 2022-2-7 15:08
本帖最后由 哇哇哇啊叭叭 于 2022-2-8 10:40 编辑

  

  可以确定地是,@a=@b=true确实能把两个变量同时赋值为真。
  有争议地是,后面@a会不会跟@b同步发生改变。记得以前遇到过这样地事情,但后来核实地时候,又无法复现这类情况了,所以什么时候会同步改变这个尚未确定。
  另外,类变量地大小写有没有严格规定呀?
  
作者: enghao_lim    时间: 2022-2-8 14:30
本帖最后由 enghao_lim 于 2022-2-8 15:13 编辑
哇哇哇啊叭叭 发表于 2022-2-7 15:08
可以确定地是,@a=@b=true确实能把两个变量同时赋值为真。
  有争议地是,后面@a会不会跟@b同步发生 ...


不会发生同步改变,基础数据不会执行指针同步,但是对象会。
大小写严格区分,既 @aBcDE 不等于 @Abcde
作者: 哇哇哇啊叭叭    时间: 2022-2-8 15:35
标题: RE: 请问下这个"@A=@B=true"是什么意思呢?
本帖最后由 哇哇哇啊叭叭 于 2022-2-8 10:39 编辑

  
  ruby不是一切皆对象吗?还是这里的对象是某种特指的含义呢?
  最早见到:
  1.   def convert_escape_characters(text)
  2.     result = text.to_s.clone
复制代码

  用克隆,而不直接用赋值的情况。擦测应当是为避免指针同步,将数据源text也一并改掉了。后面发现@xxx=@ooo=xxoo这种情况有时候会导致两变量同步变化。

  但通过这两种例子,无法分辨哪种情况是基础数据,哪种情况是对象:两者要么是局部变量,要么是类变量。或者说,两变量中,存放的对象若是用【.new】创建的,就应是对象?但直觉感觉,ruby里所有东西其实都是.new来的...


  
作者: enghao_lim    时间: 2022-2-8 20:07
哇哇哇啊叭叭 发表于 2022-2-8 15:35
ruby不是一切皆对象吗?还是这里的对象是某种特指的含义呢?
  最早见到:

boolean和numeric不是对象,没有所谓的克隆,除非自行指针操作(变量指针而非值本身),不然 a = b = 100,就是赋予同值,是否还有其他基础数据也是雷同我没查过不能确定。

这个吊诡的例子其实可以解释numeric是对象但不是对象……
  1. a = 1
  2. puts 1.object_id == a.object_id   #=> true
复制代码
解释能力有限,大致上可以被理解为只有一个值为1的Numeric被允许存在。
作者: guoxiaomi    时间: 2022-2-8 20:45
本帖最后由 guoxiaomi 于 2022-2-8 20:52 编辑

整数(Fixnum)是立即值:其“地址”并不是封装了一个指针,而是固定值

true是TrueClass的单例,我认为它也是立即值,但是文档里似乎没有提……
作者: taeckle    时间: 2022-2-28 17:25
enghao_lim 发表于 2022-2-8 14:30
不会发生同步改变,基础数据不会执行指针同步,但是对象会。
大小写严格区分,既 @aBcDE 不等于 @Abcde ...

大神请问下你说的这个对象会发生指针同步是长什么样子的呢?可以给咱举个简单的例子嘛?多谢了!
作者: enghao_lim    时间: 2022-2-28 19:26
taeckle 发表于 2022-2-28 17:25
大神请问下你说的这个对象会发生指针同步是长什么样子的呢?可以给咱举个简单的例子嘛?多谢了! ...
  1. class IamObj
  2.     attr_accessor:myValue
  3.     @myValue = nil
  4.     def initialize
  5.         @myValue = 10;
  6.     end
  7. end

  8. @a = @b = IamObj.new()

  9. print(@a.myValue)

  10. @b.myValue = 9

  11. print(@a.myValue) #指针同步所以修改@b既等于修改@a。
复制代码





欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1