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这个值在作为局部变量和方法时的情况。

比如
  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,当调用这个方法时,就会得到这个方法执行结束后的返回值。
执行过程的结尾不一定在文字层面的最末端,但一定是在其执行过程的末端。
作者: Mr.Jin    时间: 2016-8-9 14:53
  1. def v
  2.     return 32
  3. end

  4. puts v      # -> 32

  5. v = 16

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

当你调用到一个标识符的时候 会搜索相应的局部变量以及相应的函数
只存在对应的局部变量 或者是无参数函数时 可以直接以这个标识符访问相应的局部变量或无参数函数
不过同时存在时 将会视为是局部变量的值 要调用相应的无参数函数 需要加上括号
作者: 喵呜喵5    时间: 2016-8-9 16:43
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)
复制代码



==

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




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1