使用require使用带有哈希的文件

时间:2014-10-28 23:18:59

标签: ruby

我正在尝试引用另一个文件中写的哈希,并尝试:

require './filewithhash' #this file has hash

puts name_hash['somename'] #just trying access by the index

并且未定义局部变量或方法错误。

2 个答案:

答案 0 :(得分:1)

问题是当在ruby中需要文件时,局部变量超出范围。因此,在所需文件中定义的任何局部变量将在以后 时可用。

解决方案:

  1. 使您的程序面向对象并将此哈希添加为某个类
  2. 中的字段
  3. 让您的变量保持不变(例如:NAME_HASH
  4. 让您的变量全局化(例如:$name_hash
  5. 使您的变量成为实例变量(例如:@name_hash
  6. 如果程序非常简单,我会选择选项3.但如果它想要增长,1是你最好的选择。

答案 1 :(得分:0)

Ruby中的要求不仅仅像在PHP中那样内联文件;每个文件都有自己的范围。也就是说,文件中的代码将在一个范围内执行,这意味着所有局部变量都被约束到该文件的范围,并且在其外部不可见。

为了在当前范围内执行文件,您必须使用当前绑定对其进行评估:

file = "file_with_hash.rb"
File.open(file) {|f| eval f.read, binding, file }

这是一个坏主意,你不应该这样做,除非你知道你在做什么以及为什么。相反,您应该将该哈希公开为常量的成员(超出文件范围):

# foo.rb
module Foo
  PROGRAMMER_WORDS = {foo: 1, bar: 2, baz: 3}
  ...
end

# another file
require 'foo'
Foo::PROGRAMMER_WORDS # => {:foo=>1, :bar=>2, :baz=>3}