Project1
标题:
方法也可以作为一个值来用吗?
[打印本页]
作者:
kvkv97
时间:
2016-8-9 14:20
标题:
方法也可以作为一个值来用吗?
在XP脚本Window_EquipItem的第61行
self.contents = Bitmap.new(width - 32, row_max * 32)
请问:row_max不是一个局部变量吗?怎么在本类中找不到。如果是父类的方法,那么方法怎么可以作为一个值来用呢?
作者:
亿万星辰
时间:
2016-8-9 14:36
本帖最后由 亿万星辰 于 2016-8-9 14:55 编辑
简单的说当一个方法具有返回值时,就可以把它看成一个稍微复杂一些的变量,当这个字串有对应的方法存在(包括父类中)时,就会被当成方法被调用,否则才会当成一个局部变量来使用。
但其实编译的时候会有一些更复杂的判断在里面,比如你说的row_max方法,如果你在这里写一个row_max = 12,而当前类及父类中没有过row_max=(value)这样的方法时,row_max就会被当成一个局部变量来使用了,而这时候如果你又需要调用那个row_max方法的话,就需要用self.row_max来进行调用了,举了下面一个例子,可以通过执行scoreLevel方法,来看到score这个值在作为局部变量和方法时的情况。
比如
class Student
def initialize(score = 0)
@score = score
end
def scoreLevel
# 我们可以先来看一下现在用score显示出的是哪个值
p "1. Score is #{score}."
# 这里可以看到显示出的是真实的score值。
score = 100 # 这个是局部变量
# 我们可以再来.看一下现在用score显示出的是哪个值
p "2. Score is #{score}."
# 这里就变成上面赋值成100的局部变量了
# 最后我们在看该如何从这里调用正确的score方法
p "3. Score is #{self.score}."
# 所以如果真的出现了局部变量名和方法名冲突了,那么请用self.方法名来进行区分
# 当然,其实用@score的方法就可以在类内部调用到正确的score值了
p @score >= 60 ? "及格" : "不及格"
end
def score
return @score
end
end
xiaoMing = Student.new(59)
xiaoMing.scoreLevel # => "不及格"
复制代码
你可以全局查找下这个row_max方法,可以看到它作为一个方法,在其方法执行过程的结尾处一个return xxx,当调用这个方法时,就会得到这个方法执行结束后的返回值。
执行过程的结尾不一定在文字层面的最末端,但一定是在其执行过程的末端。
作者:
Mr.Jin
时间:
2016-8-9 14:53
def v
return 32
end
puts v # -> 32
v = 16
puts v # -> 16
puts v() # -> 32
复制代码
当你调用到一个标识符的时候 会搜索相应的局部变量以及相应的函数
只存在对应的局部变量 或者是无参数函数时
可以直接以这个标识符访问相应的局部变量或无参数函数
不过同时存在时 将会视为是局部变量的值 要调用相应的无参数函数 需要加上括号
作者:
喵呜喵5
时间:
2016-8-9 16:43
row_max 如果在上文环境中有定义的话,他就是一个局部变量
def row_max
return 2
end
def a
row_max = 1
p row_max
end
复制代码
如果没定义的话,Ruby 就会当成一个方法去查找
def row_max
return 2
end
def a
p row_max
end
复制代码
具体的查找顺序是:
当前类 > 父类 > 父类的父类 ……
如果沿着查找路径查找过程中找到了该方法,则停止查找
如果查找路径到头了还没有这个方法,则报错
然后你这段代码
self.contents = Bitmap.new(width - 32, row_max * 32)
复制代码
其实和下面这段代码一样
a = row_max
self.contents = Bitmap.new(width - 32, a * 32)
复制代码
==
另外,容我抱怨一句,你历来的提问帖总给人一种你根本没想得到解答的感觉,连基础的语法都没搞懂的话,请不要再去继续研究了
欢迎光临 Project1 (https://rpg.blue/)
Powered by Discuz! X3.1