gpt4 book ai didi

ruby-on-rails - ruby 中的方法不会改变变量

转载 作者:数据小太阳 更新时间:2023-10-29 08:20:33 26 4
gpt4 key购买 nike

我是 ruby​​ 的新手,也是一般编程的新手。我在独立的 ruby​​ 脚本中有一段代码,它从 yaml 文件中读取数据并将该数据分配给方法中的变量。这一切都是在一个方法中完成的。在方法的定义之外,我调用该方法并打印分配的变量的值。但是,呃哦,在方法中赋值的变量的值为 nil... 为什么?这与我假设的面向对象编程有关。有人可以详细说明吗?

下面是代码。提前谢谢你。

#!/usr/bin/env ruby

require 'pg'
require 'yaml'

source_connection=nil

def load_configurations
file_name = nil

ARGV.each do|a|
file_name = "#{a}"
end
dest_options = YAML.load_file(file_name)
source_connection = dest_options['dest_name']
end

load_configurations()

puts source_connection

##### returns nothing. why? #####

最佳答案

在 Ruby 中,就像在大多数语言中一样(至少我所知道的,Javascript 可能是个异常(exception))有一个称为可见范围的概念。

Ruby 中有四种作用域:

  • 全局范围
  • 类(class)范围
  • 方法作用域
  • block 作用域

它在实践中的意思是为 ex 定义的局部变量。 in 方法仅在此方法中可见,除非您显式向上(使用方法/ block 调用参数)或向下(使用返回)传递调用堆栈。

在您的情况下,发生的情况是在您将 source_connection 分配给 nil 的方法之外,但是随后您在不同的范围内引用相同的 var 名称,因此它仅在此处分配。 Ruby 解决此问题的方法是定义一个实例变量 (@source_connection) 或将此变量显式传递 到方法中然后返回它.

专业提示:在 Ruby 中,默认情况下会返回最后一次计算,因此您无需显式编写 return source_connection

编辑:
对于类实例和实例变量,事情会变得有点复杂,所以最好的办法是,如果我只是向您指出一本完美地阐述了这些主题的 Metaprogramming Ruby 书的方向。

编辑2:
我的重写建议(稍微改变一下样式 - 对于方法定义,无论是否有参数,总是添加括号是很好的。另一方面,对于调用,如果没有或只有一个参数,你可以省略 - 但这取决于个人品尝 ;)我还将缩进更改为 2 个空格 - 我认为这是最常用的。

#!/usr/bin/env ruby

require 'pg'
require 'yaml'

def load_configurations()
file_name = nil

ARGV.each do|a|
file_name = "#{a}"
end
dest_options = YAML.load_file(file_name)
dest_options['dest_name'] # Ruby will return last evaluation
end

source_connection = load_configurations

puts source_connection # now it will print what you expect

关于ruby-on-rails - ruby 中的方法不会改变变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17660154/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com