Ruby中如何让方法外部访问其内部定义的变量?SQL查询场景
Ruby方法内部变量外部访问问题解答
嘿,我来帮你搞定这个问题!你现在遇到的核心问题是变量作用域的问题——方法内部定义的局部变量,外部是根本访问不到的,而且你还在方法里重复创建了MySQL客户端实例,有点浪费资源哦。
先说说你现有代码的问题:
- 方法
sql里的results是局部变量,它的“活动范围”只在sql方法内部,外面的puts(results.to_a)自然会报“results未定义”的错误。 - 你已经在方法外创建了
client实例,方法里又重新创建了一个,完全没必要,多占资源还没意义。
下面给你两种靠谱的解决方案:
方案一:让方法返回查询结果(推荐)
让方法把查询结果返回出来,然后在外部把返回值赋值给变量,同时把外面已有的client实例传给方法,避免重复创建连接:
require "mysql2" # 只创建一次客户端实例 client = Mysql2::Client.new(:username => 'buck19j') def sql(client, code) # 直接返回查询结果,Ruby方法默认返回最后一行代码的执行结果 client.query(code) end # 调用方法时接收返回值,赋值给外部的results变量 results = sql(client, 'SHOW DATABASES') puts(results.to_a)
方案二:使用实例变量(可选)
如果你不想给方法传参数,可以把客户端实例定义成实例变量(用@开头),这样方法内部也能直接访问到它,同样让方法返回结果:
require "mysql2" # 定义成实例变量,整个脚本的顶层作用域都能访问 @client = Mysql2::Client.new(:username => 'buck19j') def sql(code) @client.query(code) end results = sql('SHOW DATABASES') puts(results.to_a)
简单总结下:
局部变量的作用域仅限于它所在的代码块(这里就是sql方法内部),想要拿到方法里的结果,最规范的方式就是让方法把结果返回出来,然后在外部接收这个返回值。另外,尽量复用已有的数据库连接,不要每次调用方法都新建一个,这样程序性能会更好~
内容的提问来源于stack exchange,提问作者jbounc
相关产品推荐
相关产品推荐

