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

Project1

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

[已经过期] 方法也可以作为一个值来用吗?

[复制链接]

Lv3.寻梦者

梦石
0
星屑
4169
在线时间
258 小时
注册时间
2013-10-13
帖子
815
跳转到指定楼层
1
发表于 2016-8-9 14:20:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
在XP脚本Window_EquipItem的第61行
self.contents = Bitmap.new(width - 32, row_max * 32)
请问:row_max不是一个局部变量吗?怎么在本类中找不到。如果是父类的方法,那么方法怎么可以作为一个值来用呢?

Lv2.观梦者

梦石
0
星屑
275
在线时间
1373 小时
注册时间
2005-10-16
帖子
5113

贵宾

2
发表于 2016-8-9 14:36:14 | 只看该作者
本帖最后由 亿万星辰 于 2016-8-9 14:55 编辑

简单的说当一个方法具有返回值时,就可以把它看成一个稍微复杂一些的变量,当这个字串有对应的方法存在(包括父类中)时,就会被当成方法被调用,否则才会当成一个局部变量来使用。

但其实编译的时候会有一些更复杂的判断在里面,比如你说的row_max方法,如果你在这里写一个row_max = 12,而当前类及父类中没有过row_max=(value)这样的方法时,row_max就会被当成一个局部变量来使用了,而这时候如果你又需要调用那个row_max方法的话,就需要用self.row_max来进行调用了,举了下面一个例子,可以通过执行scoreLevel方法,来看到score这个值在作为局部变量和方法时的情况。

比如
  1. class Student
  2.   def initialize(score = 0)
  3.     @score = score
  4.   end
  5.   def scoreLevel
  6.     # 我们可以先来看一下现在用score显示出的是哪个值
  7.     p "1. Score is #{score}."
  8.     # 这里可以看到显示出的是真实的score值。

  9.     score = 100 # 这个是局部变量
  10.     # 我们可以再来.看一下现在用score显示出的是哪个值
  11.     p "2. Score is #{score}."
  12.     #  这里就变成上面赋值成100的局部变量了

  13.     # 最后我们在看该如何从这里调用正确的score方法
  14.     p "3. Score is #{self.score}."
  15.     #  所以如果真的出现了局部变量名和方法名冲突了,那么请用self.方法名来进行区分

  16.     # 当然,其实用@score的方法就可以在类内部调用到正确的score值了
  17.     p @score >= 60 ? "及格" : "不及格"
  18.   end
  19.   def score
  20.     return @score
  21.   end
  22. end

  23. xiaoMing = Student.new(59)
  24. xiaoMing.scoreLevel   # =>  "不及格"
复制代码



你可以全局查找下这个row_max方法,可以看到它作为一个方法,在其方法执行过程的结尾处一个return xxx,当调用这个方法时,就会得到这个方法执行结束后的返回值。
执行过程的结尾不一定在文字层面的最末端,但一定是在其执行过程的末端。

点评

期待!!!!!!!  发表于 2016-8-22 17:07
还有这个Window类窗口的变化如果需要的话可以出个详细一点的介绍。  发表于 2016-8-22 12:08
Interpreter类可以看做是针对编辑器中的各类事件操作而存在的一个对应的操作类,其中的方法对应到的就是编辑器模式中作者做出的各种事件操作  发表于 2016-8-22 12:07
亿万,看到你的身影了。能做点视频给我们看么?或者做专栏介绍下Interpreter的一个事件,介绍下换武器窗口是怎么变化的  发表于 2016-8-19 16:23

评分

参与人数 1星屑 +200 收起 理由
hys111111 + 200 认可答案

查看全部评分

我只个搬答案的
叔叔我已经当爹了~
婚后闪人了……
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
9707
在线时间
3226 小时
注册时间
2011-3-24
帖子
739

开拓者

3
发表于 2016-8-9 14:53:09 | 只看该作者
  1. def v
  2.     return 32
  3. end

  4. puts v      # -> 32

  5. v = 16

  6. puts v      # -> 16
  7. puts v()    # -> 32
复制代码

当你调用到一个标识符的时候 会搜索相应的局部变量以及相应的函数
只存在对应的局部变量 或者是无参数函数时 可以直接以这个标识符访问相应的局部变量或无参数函数
不过同时存在时 将会视为是局部变量的值 要调用相应的无参数函数 需要加上括号

评分

参与人数 1星屑 +100 收起 理由
hys111111 + 100 认可答案

查看全部评分

>>→Lanza Games 2020←<<
Lanza Schneider
浪子心,孤星梦永远流浪……
~不会放弃,我的精力永远充沛~
>>>>>Lanza Adventure<<<<<
>>>>>Lanza的新年派对!<<<<<
>>>>>Lanza的口袋心脏病!<<<<<
回复 支持 反对

使用道具 举报

Lv5.捕梦者 (暗夜天使)

只有笨蛋才会看到

梦石
1
星屑
21484
在线时间
9389 小时
注册时间
2012-6-19
帖子
7114

开拓者短篇九导演组冠军

4
发表于 2016-8-9 16:43:34 | 只看该作者
row_max 如果在上文环境中有定义的话,他就是一个局部变量

  1. def row_max
  2.   return 2
  3. end
  4. def a
  5.   row_max = 1
  6.   p row_max
  7. end
复制代码


如果没定义的话,Ruby 就会当成一个方法去查找

  1. def row_max
  2.   return 2
  3. end
  4. def a  
  5.   p row_max
  6. end
复制代码


具体的查找顺序是:
当前类 > 父类 > 父类的父类 ……
如果沿着查找路径查找过程中找到了该方法,则停止查找
如果查找路径到头了还没有这个方法,则报错

然后你这段代码

  1. self.contents = Bitmap.new(width - 32, row_max * 32)
复制代码


其实和下面这段代码一样

  1. a = row_max
  2. self.contents = Bitmap.new(width - 32, a * 32)
复制代码



==

另外,容我抱怨一句,你历来的提问帖总给人一种你根本没想得到解答的感觉,连基础的语法都没搞懂的话,请不要再去继续研究了

点评

实际上吧,你这个帖子提的问题根本不是逻辑性问题,而是基础语法问题。实际上,你之前提的问题很多都是基础语法相关的问题  发表于 2016-8-18 11:50
连基础的语法都没搞懂的话,请不要再去继续研究了——语法我觉得我基本掌握了,剩下的只是对逻辑性不太了解而已  发表于 2016-8-18 10:49
另外,容我抱怨一句,你历来的提问帖总给人一种你根本没想得到解答的感觉——我的提问没出现过这种现象啊,别人从来没提过!  发表于 2016-8-18 10:48

评分

参与人数 1星屑 +100 收起 理由
hys111111 + 100 认可答案

查看全部评分

回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-9-22 07:15

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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