ruby -- 全局和局部问题

 芬飞满天2011 发布于 2022-10-26 16:06
n = 5
def num
  puts n
end

为什么是错的的?
我知道全局和局部基本原理。
局部变量在函数里只能使用,在外部是不存在。

但是在python或js里使用这样方式可以执行的!
还是只有ruby要在函数使用变量需要重新宣告。

请问各位可以解释吗?
谢谢

6 个回答
  • 做个笔记:def与def_method的区别:def是用来定义方法的关键字;def_method是一个方法,它的作用是产生一个新方法,def中的代码跟上下文完全隔离的(只认识带@跟美刀的变量);而define_method就显得更加open一点,乐意结识不带任何修饰的小伙伴。

    2022-10-27 01:01 回答
  • 这问题火啊。刚刚去趟,回来就几人回答了。

    你的代码中的n,你以为是全局变量,可惜不是

    irb(main):006:0> x =10
    => 10
    irb(main):009:0> defined? x
    => "local-variable"
    

    需要修改就是加个$作为前缀即可:

    irb(main):010:0> $x = 1
    => 1
    irb(main):011:0> defined? $x
    => "global-variable"
    

    在美好的ruby 风格中 ,$是多么扎眼啊。ruby老板知道全局变量不可缺,但是也怕滥用,因此玩了一个小把戏;)。涉及到的是ruby variables scope 的知识,ruby的优点复杂也与众不同。

    @andrewzhyl 说的不错,点赞。

    2022-10-27 01:01 回答
  • @Andrew_375683 说的是正确的.
    主要是作用域的问题
    不过这里还有个简单的方法解决将n变成函数就可以了

    def n
      5
    end
    
    def num
      p n
    end
    
    num
    
    2022-10-27 01:01 回答
  • 但是在python或js里使用这样方式可以执行的!

    Python 中是只读


    以下是猜想为什么 Ruby 要这么搞?

    Ruby 中 def 生成的方法只能访问全局变量。
    define_method 生成的方法 和 -> (param) {}lambda { |param| } 生成的 proc 带闭包,可以访问外层变量。

    我猜想是因为 Ruby 认为最常用的情况是你不需要访问外层变量,所以 def 不给你访问了,这样的好处:

    • 不会像 js 一样无意中搞乱外层变量。JavaScript 中为了避免这一点,都要在 function 头部把体内用到的变量都 undefined 一下,很罗嗦。
    • 不用创建闭包,节省开销。

    至于 lambda 带闭包那很正常,都 lambda 了不带闭包说的过去吗?

    至于 define_method,猜想是因为

    • define_method 因为是所谓元编程,有更大机率用外层变量,(本来用元编程就是偷懒少打字,要是不能用外层变量,还要作为参数传入,那累死了。)所以就带闭包。
    • method 定义不能带闭包有时候会不方便,但是通常也不需要,所以就让长一点的 define_method 带闭包啰。
    • define_method 除了 define_method (symbol) { |param| },还可以写成 define_method(symbol, method),其中 method 比较常用的就是传入一个 lambda,既然传入 lambda,如果本身 define_method 不带闭包,那就会很违和的说,所以就让它带啰。
    2022-10-27 01:01 回答
  • @n = 5
    def num
        puts @n
    end
    

    我也是初学者,看看其它高手怎么说。

    2022-10-27 01:01 回答
  • def 是打开了一个新的作用域

    n = 5
    local_variables       # => [:n, :_]
    def num
      local_variables     # => []
    end
    

    如果你要访问 n,需要用扁平化作用域

    define_method :num do
        puts n
    end
    
    2022-10-27 01:02 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有