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

Project1

 找回密码
 注册会员
搜索
楼主: TERENCE
打印 上一主题 下一主题

[讨论]RUBY中破坏性的方法有哪些?

 关闭 [复制链接]

Lv1.梦旅人

梦石
0
星屑
50
在线时间
128 小时
注册时间
2009-1-28
帖子
2790
11
发表于 2009-5-29 15:27:23 | 只看该作者
以下引用紫苏于2009-5-29 5:23:33的发言:
这个很简单,就是冻结一个对象,让它无法被修改了~要注意它冻结的是对象本身,而不是一个引用变量 =)

你说得很对.
但是....与其冻结他,对它不使用操作命令不是更好吗?

炼金术的根本法则是等价交换。想要获得,必须失去同等价值的东西。每当烦躁的时候,煎熬在不想做却又正在做的烦心事中的时候,我就安慰自己,提醒自己做这些事情的目的所在,告诉自己不要忽略所获得或者即将获得的回报,物质的,精神的,肉体的,灵魂的回报!只做想做的事情,就会失去不想失去的东西。
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
61
在线时间
24 小时
注册时间
2008-8-5
帖子
1924
12
发表于 2009-5-29 15:43:44 | 只看该作者
以下引用精灵使者于2009-5-29 7:09:22的发言:

已经冻结的变量和常量(恒量)的管理方法应该是一样的吧。
怎样解除已经冻结的变量?

对象本身一旦冻结,不可解除……{/ll}
不过可以调用 dup 方法来返回一个没有冻结的克隆对象~

以下引用霜冻之狼于2009-5-29 7:27:23的发言:

但是....与其冻结他,对它不使用操作命令不是更好吗?

在规模比较大的代码编写中,有一部分数据是你不想改动的,但你又怕在调试过程中不小心改动到了,这时就可以把对象冻结……其实也就是让它变成常量了

这个机制可能也就是在保护数组内容的时候用得比较多,数字啊、true/false/nil 啊那些对象由于本身是单一实例的,所以本身是不可能被修改的,冻结它们也就没有意义了
回复 支持 反对

使用道具 举报

Lv1.梦旅人

炎发灼眼的讨伐者

梦石
0
星屑
50
在线时间
1707 小时
注册时间
2007-8-4
帖子
904
13
发表于 2009-5-29 16:39:30 | 只看该作者
以下引用紫苏于2009-5-29 5:23:33的发言:


而特殊方法又是因为什么才叫特殊方法??

这个……还真不知道什么特殊方法不会被 dup 复制
刚才试了下,跟访问权限没关系诶


[本贴由作者于 2009-5-29 6:14:18 最后编辑]

class A
end
class << a = A.new
  def func1
    :func1
  end
end
b = a.dup
a.func1 # ok
b.func1 # undefined method `func1'
c = a.clone
c.func1 # ok

RMXP&amp;RMVX通用Web化完成- -|||
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
61
在线时间
24 小时
注册时间
2008-8-5
帖子
1924
14
发表于 2009-5-29 16:51:11 | 只看该作者
以下引用灼眼的夏娜于2009-5-29 8:39:30的发言:

class A
end
class << a = A.new
def func1
   :func1
end
end
b = a.dup
a.func1 # ok
b.func1 # undefined method `func1'
c = a.clone
c.func1 # ok

果然神就是神啊{/cy},受教了,原来特殊方法就是单例方法~
这样写应该是一样的吧:
class A
end

a = A.new

def a.fn
end

b = a.dup
c = a.clone

a.fn # OK
b.fn # Error!
c.fn # OK
回复 支持 反对

使用道具 举报

Lv1.梦旅人

炎发灼眼的讨伐者

梦石
0
星屑
50
在线时间
1707 小时
注册时间
2007-8-4
帖子
904
15
发表于 2009-5-29 16:54:02 | 只看该作者
一样的  - -神么{/gg} 呃呃。。= =

话说紫苏的程序学的挺好的><
RMXP&amp;RMVX通用Web化完成- -|||
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
128 小时
注册时间
2009-1-28
帖子
2790
16
发表于 2009-5-29 17:01:26 | 只看该作者
以下引用灼眼的夏娜于2009-5-29 8:54:02的发言:
一样的  - -神么 呃呃。。= =
话说紫苏的程序学的挺好的><

好了好了,你们两个就别那么客气了...都是自己人...

炼金术的根本法则是等价交换。想要获得,必须失去同等价值的东西。每当烦躁的时候,煎熬在不想做却又正在做的烦心事中的时候,我就安慰自己,提醒自己做这些事情的目的所在,告诉自己不要忽略所获得或者即将获得的回报,物质的,精神的,肉体的,灵魂的回报!只做想做的事情,就会失去不想失去的东西。
回复 支持 反对

使用道具 举报

Lv3.寻梦者 (暗夜天使)

精灵族の天使

梦石
0
星屑
1697
在线时间
3038 小时
注册时间
2007-3-16
帖子
33731

开拓者贵宾

17
发表于 2009-5-29 18:08:23 | 只看该作者
如此看来,那个只能输入一次且不可修改的东西就是这样设计的吧。
修改保存的数据会将其冻结……使其不能再进行修改操作。
回复 支持 反对

使用道具 举报

Lv1.梦旅人

龙皇

梦石
0
星屑
50
在线时间
83 小时
注册时间
2007-8-8
帖子
2956
18
 楼主| 发表于 2009-5-29 18:55:30 | 只看该作者
以下引用紫苏于2009-5-29 5:23:33的发言:
你书上这样说的话其实有点问题 ^__^
dup 和 clone 都会拷贝对象的污染状态,但 dup 不会拷贝对象的冻结状态,这就是区别~

原来书上笔误了!~~赶紧更正


多谢紫苏的教导,虽然有些地方还是有点不清楚 ←这是我的问题



关於特殊方法
灼眼的夏娜跟紫苏写的是相同的东西吧??

不过我似乎看不太懂单例方法
紫苏写的或许还能懂一些些
但灼眼的夏娜写的....
class << a = A.new
我看不懂了  @_@

P.S.
一个帖子才问了一个问题 我却问了一堆= =
对打那麼多字的紫苏有点不好意思了。


一个问题我竟然衍伸出那麼多个问题,
看来我的RUBY功力还不深厚啊啊啊.........

                签名图来自:無限のファンタジア
                 我的RMXP专题空间--龙使传说
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
128 小时
注册时间
2009-1-28
帖子
2790
19
发表于 2009-5-29 19:18:55 | 只看该作者
以下引用TERENCE于2009-5-29 10:55:30的发言:
一个问题我竟然衍伸出那麼多个问题,
看来我的RUBY功力还不深厚啊啊啊.........

课堂是最不需要担心犯错的地方,敢于发问本身就证明你有进步...

炼金术的根本法则是等价交换。想要获得,必须失去同等价值的东西。每当烦躁的时候,煎熬在不想做却又正在做的烦心事中的时候,我就安慰自己,提醒自己做这些事情的目的所在,告诉自己不要忽略所获得或者即将获得的回报,物质的,精神的,肉体的,灵魂的回报!只做想做的事情,就会失去不想失去的东西。
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
61
在线时间
24 小时
注册时间
2008-8-5
帖子
1924
20
发表于 2009-5-29 19:51:53 | 只看该作者
龙兄客气了,多打点字对我也有好处~{/hx}

单例方法就是只属于单个对象实例的方法,这是 Ruby 的特性
比如,张三、李四都是“人”类的对象,我们可以专门给张三其人定义一个只属于他的方法“抽烟”,而这个“抽烟”的方法并没有在“人”类中定义,这样全天下的“人”类就只有张三这个人会抽烟了:
class Person
   def initialize(name)
     @name = name
     @health = 100
   end
   def say_hello
     print "你好,我的名字是#@name,请多指教!"
   end
end

zhangsan = Person.new("张三")
lisi = Person.new("李四")

def zhangsan.smoke
   @health -= 1
end

zhangsan.say_hello  # OK
lisi.say_hello      # OK
zhangsan.smoke      # OK
lisi.smoke          # Error! 此人不会抽烟……

俺那种写法和夏娜的那种写法都是让 a 这个对象的直属类变为了一个匿名单例类(没有类名,且实例只有一个,就是 a),而 a 原来的直属类 A 就成了这个匿名类的父类……
class << a = A.new 这一句可能这样写更简单易懂些:
a = A.new
class << a

a = A.new 会先执行,赋值结束后它的值就是 a 本身,class << a 就会专门为 a 这个实例建立一个匿名类~
这两种方式的区别在于一个是明确地去建立一个匿名类,并在类中定义单例方法;另一种则是直接用 def obj.method 的方式隐式地建立了匿名类
系统信息:本贴由楼主认可为正确答案,66RPG感谢您的热情解答~
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2025-1-12 06:52

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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