就我个人而言,当我想让一段数据像一个数据集合一样工作,而不是在Hash
下松散耦合时,我会使用struct.
例如,我制作了一个从Youtube下载视频的脚本,其中我有一个 struct 来表示视频,并测试所有数据是否到位:
Video = Struct.new(:title, :video_id, :id) do
def to_s
"http://youtube.com/get_video.php?t=#{id}&video_id=#{video_id}&fmt=18"
end
def empty?
@title.nil? and @video_id.nil? and @id.nil?
end
end
稍后在我的代码中,我有一个循环,它遍历视频源HTML页面中的所有行,直到empty?
不返回true.
我看到的另一个例子是James Edward Gray IIs configuration class,它使用OpenStruct
轻松添加从外部文件加载的配置变量:
#!/usr/bin/env ruby -wKU
require "ostruct"
module Config
module_function
def load_config_file(path)
eval <<-END_CONFIG
config = OpenStruct.new
#{File.read(path)}
config
END_CONFIG
end
end
# configuration_file.rb
config.db = File.join(ENV['HOME'], '.cool-program.db')
config.user = ENV['USER']
# Usage:
Config = Config.load_config('configuration_file.rb')
Config.db # => /home/ba/.cool-program.db
Config.user # => ba
Config.non_existant # => Nil
如果设置了Struct
,则返回的属性之间的差异为OpenStruct
,而设置的属性之间的差异为100