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

Project1

 找回密码
 注册会员
搜索
12
返回列表 发新帖
楼主: DeathKing
打印 上一主题 下一主题

[已经解决] 有关方法重载的一个悲剧

[复制链接]

Lv3.寻梦者

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

贵宾

11
 楼主| 发表于 2010-7-22 12:42:52 | 只看该作者
能否详细说明一下其中的奥妙?对Ruby和C之间的勾当很有兴趣。
   

点评

找紫苏找紫苏……你看人家一语中的= =  发表于 2010-7-22 12:43

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

使用道具 举报

Lv2.观梦者

旅之愚者

梦石
0
星屑
255
在线时间
812 小时
注册时间
2007-7-28
帖子
2148

贵宾

12
发表于 2010-7-22 12:52:48 | 只看该作者
回复 DeathKing 的帖子

大约是被ruby当成局部变量了
   
回复 支持 反对

使用道具 举报

Lv3.寻梦者

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

贵宾

13
 楼主| 发表于 2010-7-22 12:54:26 | 只看该作者
回复 六祈 的帖子


    我加了括号变方法了啊(而且有参数)

点评

加括号不和方法没必然关系 a = (5) 依然可以括号~ 。。  发表于 2010-7-22 12:57
回复 支持 反对

使用道具 举报

Lv2.观梦者

旅之愚者

梦石
0
星屑
255
在线时间
812 小时
注册时间
2007-7-28
帖子
2148

贵宾

14
发表于 2010-7-22 12:59:41 | 只看该作者
回复 DeathKing 的帖子
于是推测ruby对形如xxx=的执行优先级如下:
1.def定义的方法
2.局部变量
3.alias出来的方法

   
回复 支持 反对

使用道具 举报

Lv1.梦旅人

炎发灼眼的讨伐者

梦石
0
星屑
50
在线时间
1707 小时
注册时间
2007-8-4
帖子
904
15
发表于 2010-7-22 13:01:28 | 只看该作者
回复
于是推测ruby对形如xxx=的执行优先级如下:
1.def定义的方法
2.局部变量
3.alias出来的方法

     ...
六祈 发表于 2010-7-22 12:59


varname = value 都是对局部变量赋值~ 不会调用方法 和 def的 alias的没关系

点评

受教了!irb测试了下,确实如此  发表于 2010-7-22 13:04
回复 支持 反对

使用道具 举报

Lv3.寻梦者

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

贵宾

16
 楼主| 发表于 2010-7-22 13:07:54 | 只看该作者
回复 灼眼的夏娜 的帖子

先膜拜一下夏娜大人

但是如果我使用 method= value 也会算成变量?

顺便打听RGE2.0的消息。
   

点评

看来这个.必不可少,君可见accessor的方法都是xxx.xxx的,内部调用看来只能self了  发表于 2010-7-22 13:09
回复 支持 反对

使用道具 举报

Lv3.寻梦者

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

贵宾

17
 楼主| 发表于 2010-7-22 13:12:36 | 只看该作者
纯引用zh君的话,应该不算连帖吧?

古明地 蓝13:07:02
因为咱主人变笨了- -所以我也变笨了- -
右代宫 真里亚  13:07:11
self.xxx?
古明地 蓝  13:07:14

古明地 蓝13:07:25
调用带等号的方法的话
右代宫 真里亚 13:07:46
需要加 self ?
右代宫 真里亚  13:07:57
这个还真不知道
古明地 蓝  13:08:03
必须跟程序说清楚【这是方法】
否则程序会认为是局部变量
右代宫 真里亚13:08:25
= =
古明地 蓝13:08:24
因为带等号的方法通常都用作外部接口
死君(DK)13:08:27
囧死我 - -明白了,谢谢
右代宫 真里亚 13:08:31
C 里就没这个问题
古明地 蓝 13:08:34
所以大多数情况就不需要了
古明地 蓝  13:08:45
比如@window.x = XXX
古明地 蓝 13:08:52
这样程序能认出来是方法
古明地 蓝13:09:03
但是要是内部的话,除了直接对@x赋值之外
右代宫 真里亚 13:09:08
方法和变量时相同的名字了
古明地 蓝  13:09:08
就得用self.x = x

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

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
61
在线时间
24 小时
注册时间
2008-8-5
帖子
1924
18
发表于 2010-7-22 14:10:50 | 只看该作者
这个和解释器的实现有关,就快上完编译原理了,现炒现卖:

无论是解释器还是编译器,在解释、编译程序的时候都有两个相同的过程,第一个是词法分析,第二个是文法分析。两个过程都等同于把源文件遍历一次,前者是把源文件字元化,后者是解析字元,分析并检验语法,我们这个问题就和两者都有关。

字元化和解析都需要用到一个叫做确定性有限自动机的糟糕物(其英文缩写可能听过的人更多:DFA),和工程学里的有限状态自动机是一个概念,其作用有点像正则表达式,可以用有限的状态来组建一个字母串匹配模型。区别在于正则表达式仅仅是匹配字符串,其字母表是 ASCII 字符集,而确定性有限自动机可以表示任何字母,比如颜色的集合。自动机初始时是在一个“开始”状态,接着就开始逐字母读取,每获取一个字母,就根据“过渡”跳转到相应的状态。过渡是连接两个状态的桥梁,根据输入的字母的不同会有相应的过渡跳转到不同的状态。举个例子:可以设计这样一个自动机,开始状态为 S,接收到左圆括号 ( 字符则跳转到状态 A,在状态 A 时,输入任意字符都过渡这个状态本身,直到获取到一个右圆括号,才跳转到状态 B。如果我们把这个 “)” 所对应的状态设置为一个接受状态,那么这个简单的自动机实际上就是匹配了任意被圆括号包围的字符串,用相应的正则表达式表示就是 /\(.*\)/。

通过字元的有限状态自动机,我们可以用各种分隔符来表示一个字元的开始和结束,到最后,程序语言中的各种字元都会被按照在源件中出现的先后顺序串联起来。

这里就有一个问题:如何区分方法和局部变量。从正则语言的角度来讲,除了一些带特殊符号的方法名之外,方法名与局部变量名没有区别。显然字元的确定性有限自动机并不能有效地区分它们——在字元层上,这两者没有分别,所以需要把问题带到解析层上。

解析也有很多种方法,比较常见的是用 LR 解析器,进行从左到右的解析。在此之前,Ruby 必须要有一个严谨的语法定义:Part A:上下文无关文法;Part B:上下文有关文法。第一个部分是主要是一系列与上下文无关的生产规则,如 expr -> expr + expr 就是一个生产规则,意思是说一个表达式 A 的语法可以衍生为表达式 B + 表达式 C;第二个部分是与上下文有关语法,禁止使用未定义的变量、变量重声明都是上下文有关文法的一种。各种生产规则虽然变化多端,但却并非变化无穷,所以仍然可以被某种确定性有限自动机描述。

Ruby 首先遍历源文件,进行字元化,于是特殊符号和不带特殊符号的方法名或是变量名就分开了。我们姑且给除了关键字以外的所有以字母打头,以字母、数字或下划线结尾的字元取字元名: ID;称 “=” 这个符号为 BECOME;称 self 为 SELF,称小圆点 “.” 为 DOT。
在文法分析开始时,我们已经有了一个完整的字元列表。解释器随后会枚举列表中的字元,进行某种解析。

不难想到这里的存在的歧义:Ruby 方法名中可带 “=” 字元,是一个 ID 跟着一个 BECOME;而赋值语句,也是一个 ID 跟着一个 BECOME。

在这里 Ruby 必须只能做出一个抉择,那就是方法优先,还是变量名优先。再三考虑后,还是决定变量名优先,因为变量名可以统一使用 { ID } 跟着 { BECOME } 的形式来决定。具体的做法类似于:

如果前面没有 { SELF } 接着 { DOT } 的字元,那么当前如果输入了一个 ID 则处于状态 A,如果在状态 A,且下一个字元是 BECOME,那么 Ruby 会假设这是一个赋值语句,并跳转到相应的、独有的状态。所以 ID 表示的符号本身一定是一个局部变量,并把该符号列入符号表中,用某种方式提醒自己这个符号不是方法。

然而这里还有一另一个解析过程,就是 { SELF } 接着 { DOT }。如果出现这个组合,那么预先定义好的上下文无关语法的确定性有限自动机就会过渡到另一个状态 B。如果在状态 B,且下一个字元是 { ID },那么 Ruby 就会认为这是一个方法,并过渡到相应的、独有的状态。

一句话概括:self.XXXX= 和 XXXX= 是由在解释器定义的上下文无关文法所区分的,在其 DFA 中,它们分别处于两个不同的状态,所以相同的 XXXX 字元以及在这之后的字元也会有不同的意义。

点评

概,没有研究;确定性有限自动机则主要是用来识别正则语言  发表于 2010-7-22 20:05
自动机的理论是通用的,所以肯定有很多相似处,不同的是一个是实用型机,一个是理论型机——图灵机主要是一种理论上的计算模型,其本身是用来抽象地表示计算机本身的,所以人工智能领域有极大的作用,我也只知道个大   发表于 2010-7-22 20:04
总算是看明白了,其中有些东西算图灵机的概念?  发表于 2010-7-22 19:31
回复 支持 反对

使用道具 举报

Lv1.梦旅人

炎发灼眼的讨伐者

梦石
0
星屑
50
在线时间
1707 小时
注册时间
2007-8-4
帖子
904
19
发表于 2010-7-22 19:03:04 | 只看该作者
回复 DeathKing 的帖子


    是的 method=var 也会算成对变量赋值~  2.0缓慢进行中 目前大家在设计各种工具那些><
RMXP&amp;RMVX通用Web化完成- -|||
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-9-30 22:32

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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