符号和哈希值与任何其他值一样,并且可以像任何其他值类型一样传递。
回想一下,ActiveRecord 模型接受哈希值作为参数;它最终与此类似(不是这么简单,但最终是相同的想法):
class User
attr_accessor :fname, :lname
def initialize(args)
@fname = args[:fname] if args[:fname]
@lname = args[:lname] if args[:lname]
end
end
u = User.new(:fname => 'Joe', :lname => 'Hacker')
这利用了不必将散列放在大括号中的优点{}
除非您需要消除参数的歧义(并且当您跳过括号时也会出现块解析问题)。
相似地:
class TestItOut
attr_accessor :field_name, :validations
def initialize(field_name, validations)
@field_name = field_name
@validations = validations
end
def show_validations
puts "Validating field '#{field_name}' with:"
validations.each do |type, args|
puts " validator '#{type}' with args '#{args}'"
end
end
end
t = TestItOut.new(:name, presence: true, length: { min: 2, max: 10 })
t.show_validations
这输出:
Validating field 'name' with:
validator 'presence' with args 'true'
validator 'length' with args '{min: 2, max: 10}'
从那里你可以开始了解这样的事情是如何工作的。