Символы и хэши являются значениями, как и любые другие, и могут передаваться как любой другой тип значения.
Напомним, что модели 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}'
Оттуда вы можете начать видеть, как такие вещи работают.