设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 2456|回复: 13
打印 上一主题 下一主题

[有事请教] RUBY中如何顯式地對整數變量建立引用變量?

[复制链接]

Lv2.观梦者

梦石
0
星屑
515
在线时间
177 小时
注册时间
2006-10-3
帖子
618
跳转到指定楼层
1
发表于 2013-3-27 12:12:59 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
如果是類實例只要在初始化變量時直接以目標變量初始化,就會自動建立引用關係。但是對於整數等基礎類型則是副本。如何對整數變量顯式地創建引用變量?

点评

对了,这里水一笔,很喜欢你个性签名的那句话。  发表于 2013-3-27 20:26
在我初学RM的时候觉得脚本是高手的工具,等我学会了编程技术后才发现脚本原来是小孩子的玩具。
头像被屏蔽

Lv2.观梦者 (禁止发言)

梦石
0
星屑
653
在线时间
3774 小时
注册时间
2011-2-26
帖子
1839

开拓者

14
发表于 2013-3-28 22:38:40 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv2.观梦者 (禁止发言)

梦石
0
星屑
653
在线时间
3774 小时
注册时间
2011-2-26
帖子
1839

开拓者

13
发表于 2013-3-28 21:34:50 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1305
在线时间
1564 小时
注册时间
2008-7-30
帖子
4418

贵宾

12
发表于 2013-3-28 20:56:05 | 只看该作者
晴兰 发表于 2013-3-27 19:46
你可以把想要的声明方式写出来,然后再考虑实现。
Ruby最大的代码库是Ruby On Rails,如果读他的代码就会 ...

Fixnum类的object_id是可以算的,公式是:值*2 + 1。

See FScript Here:https://github.com/DeathKing/fscript
潜心编写URG3中。
所有对URG3的疑问和勘误或者建议,请移步至发布页面。
欢迎萌妹纸催更
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
61
在线时间
24 小时
注册时间
2008-8-5
帖子
1924
11
发表于 2013-3-28 04:55:11 | 只看该作者
流川枫 发表于 2013-3-27 19:38
class Ref
  attr_accessor :obj
  def initialize(obj)

哈哈~前幾天才和人討論過這個問題,在 Ruby/Python/Java 中所謂的傳遞引用和 C++ 中的傳遞引用是不同的,在 Python 社區這個概念被稱為「call by sharing」,但在 Ruby 和 Java 社區這個概念依然被稱為「call by reference」……

詳見 http://en.wikipedia.org/wiki/Evaluation_strategy#Call_by_sharing

点评

Ruby总感觉一会儿是传值,一会儿是引用(数组等的时候)。很闹心。  发表于 2013-3-28 20:57
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1305
在线时间
1564 小时
注册时间
2008-7-30
帖子
4418

贵宾

10
发表于 2013-3-27 20:22:17 | 只看该作者
本帖最后由 DeathKing 于 2013-3-27 20:23 编辑


RUBY 代码复制
  1. a = 1
  2. id = a.obejct_id #=> 3
  3. ObjectSpace._id2ref(id).inspect #=> "1"


你还是换个解决方法吧,总赶觉这样很丑陋。


囧,用成quote标签了。

点评

发现DK大大。。其实整数的id也是和值密切相关的吧……  发表于 2013-3-27 20:36

See FScript Here:https://github.com/DeathKing/fscript
潜心编写URG3中。
所有对URG3的疑问和勘误或者建议,请移步至发布页面。
欢迎萌妹纸催更
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv2.观梦者 (禁止发言)

梦石
0
星屑
653
在线时间
3774 小时
注册时间
2011-2-26
帖子
1839

开拓者

9
发表于 2013-3-27 19:46:12 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
515
在线时间
177 小时
注册时间
2006-10-3
帖子
618
8
 楼主| 发表于 2013-3-27 19:38:30 | 只看该作者
晴兰 发表于 2013-3-27 19:24
其实老代码里面的等号会出问题,可以有多种方式来解决
比方说下面的v = 换成v[]=
v+=3换成v[] += 3

class Ref
  attr_accessor :obj
  def initialize(obj)
    @obj = obj
  end
  def method_missing(sym, *args)
    obj.send sym, *args
  end

  def to_int
    obj
  end
  def to_str
    obj
  end
  def to_ary
    obj
  end
end

a = Ref.new(5)
ss = a
ss.obj = 6
p a

這樣輸出6

点评

其实主要是Ruby不能重载等号,要不然管他三七二十一重载了就没有这么多考虑了,在等号里面写装拆箱的代码就行了……  发表于 2013-3-27 19:44
也就是說 這個手動裝箱後導致 a 和 ss 都是同一個 類實例 的引用,而我雖然知道這樣可以引用整數,可是這樣要求改變目標變量聲明方式 太麻煩  发表于 2013-3-27 19:44
这就相当于为6创建一个变量了。。如果ss=6的话ss只是6的别名,根本没有C意义上的变量  发表于 2013-3-27 19:40
在我初学RM的时候觉得脚本是高手的工具,等我学会了编程技术后才发现脚本原来是小孩子的玩具。
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv2.观梦者 (禁止发言)

梦石
0
星屑
653
在线时间
3774 小时
注册时间
2011-2-26
帖子
1839

开拓者

7
发表于 2013-3-27 19:24:45 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
515
在线时间
177 小时
注册时间
2006-10-3
帖子
618
6
 楼主| 发表于 2013-3-27 19:19:59 | 只看该作者
晴兰 发表于 2013-3-27 19:07
很粗糙的一个写法,另Ruby1.9才有BasicObject,如果是Ruby1.8就干脆去掉这个继承,同时undef一堆奇怪的方法 ...

class Ref
  attr_accessor :obj
  def initialize(obj)
    @obj = obj
  end
  def method_missing(sym, *args)
    obj.send sym, *args
  end

  def to_int
    obj
  end
  def to_str
    obj
  end
  def to_ary
    obj
  end
end

ss = 5
a = Ref.new(ss)
ss = 6
p a
---------------------
輸出為 #<Ref:0x1c357a8 @obj=5>
而不是 ss的6

点评

相当于a是变量,ss是3;而并非ss是变量,a=&ss。  发表于 2013-3-27 19:37
不是,就算是在java或者C#里面你这样写结果也是不变的。如果你想把改成6反映到别的地方去,见我下面那个例子。  发表于 2013-3-27 19:36
ss = 5 a = Ref.new(ss) a = 6 p ss 改成這樣輸出也是5  发表于 2013-3-27 19:31
这个写法中a是所谓的‘引用’,要修改的是a而不是ss  发表于 2013-3-27 19:20
在我初学RM的时候觉得脚本是高手的工具,等我学会了编程技术后才发现脚本原来是小孩子的玩具。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2025-9-13 03:58

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表