11行的bug是故意放在那里的.我很好奇pry在这个例子中是如何工作的.

在下面的代码中,当我输入pry时,如果我输入name,我得到nil,这意味着pry正在输出局部变量的值,该值将在第11行初始化.然而,有一个getter方法name,如果我在第9行输出其值,我得到"Nemo".

pry是否首先在方法中查找局部变量?如果是这样,为什么第9行的name不是未定义的?

class Animal               
  attr_accessor :name      
                            
  def initialize(name)      
    @name = name            
  end                       
                            
  def change_name    
    binding.pry  
    p name   
    name = name.upcase      
  end                       
end                         
                            
fish = Animal.new('Nemo')     
p fish.name # => 'Nemo'       
p fish.change_name      

推荐答案

name =是变量赋值,这意味着name是局部变量.

Ruby预见到了这一点,并将该方法中name的所有实例解释为这样.这看起来像是心理知识,但请记住Ruby早在实际执行该函数之前就已经阅读并编译了该函数.

Ruby相关问答推荐

如何在Ruby中匹配大型IP网络对象列表中的IP地址

获取用于传递参数的变量名称

如何在 Ruby 中反转数字的字节顺序

当我在 Ruby 中围绕最后一个字符拆分时,如何拆分字符串?

多线程期间的 MRI ruby​​ 内存访问特性

如何使用正则表达式在字符串中查找特定匹配项

如何在 OpenURI 中指定http 请求标头

在Ruby中将嵌套哈希键从CamelCase转换为snake_case

使用 Bundler 时,为什么要关心 RVM 的 Gemset 功能?

Integer(value) 和 value.to_i 之间的区别

在 Ruby 中,如何确定字符串是否不在数组中?

将ruby数组转换为连续对数组

Ruby 中的排序稳定吗?

查找两个数组之间的共同值

如何引用全局变量和类变量?

确定一个值是否存在于哈希数组中

Ruby 1.9:如何正确大写和小写多字节字符串?

项目目录的相对路径

Integer 和 Fixnum 有什么区别?

`gem install therubyracer` 在 Mac OS X Lion 上失败