所以我在扩展常见Ruby数据类型的功能方面有一个最佳实践问题。
所以Rails当然有一个很好的方法pluralize
,它接受一个字符串并将其复数。我特别感兴趣的是你可以打电话
"square".pluralize
并收到
=> "squares"
作为回报。我想做的是类似的事情 - 除了哈希。为了这个问题,我们假设我有一个方法pluralize_each
,它将散列的每个key
和value
复数化。
def pluralize_each hash
hash.each {|key,value| puts key.pluralize + "=>" + value.pluralize }
end
如何操作此方法以便我只能在哈希上调用它? 例如,我希望能够致电
{"cat" => "dog"}.pluralize_each
#=> {"cats" => "dogs"}
(让我们忘记这个特殊的方法现在还没有完全正常运行,有嵌套的哈希等等。)
除了扩展哈希类之外,还有什么方法可以做到这一点吗?我认为会有办法。
答案 0 :(得分:2)
使用模块:
module HashPluralize
def pluralize
each { |key,value| puts "#{key.pluralize} => #{value.pluralize}" }
end
end
Hash.send(:include, HashPluralize)
# Usage example:
{'user' => 'product'}.pluralize
users => products
@ KL-7合法地要求课程编辑与模块扩展。这是我的意见:
如果您正在编写有机的东西,那么模块可以用于优化重构/代码组织。例如:
module Pluralization
def self.included(klass)
klass.send :include, Pluralization.const_get(klass.to_s)
rescue TypeError
raise NotImplementedError.new("A pluralization method for the #{klass}" +
" class is not supported at the moment")
end
module Array
def pluralize
'array pluralization implementation'
end
end
module Hash
def pluralize
'hash pluralization implementation'
end
end
end
Array.send :include, Pluralization
Hash.send :include, Pluralization
puts Array.new.pluralize
puts Hash.new.pluralize
此模块允许您定义一种干净的方式来定义各种类的复数形式;您可以添加配置,在各种文件中分隔复数方法等。
无论如何,如果你只是想在Hash类中添加pluralize
方法,编辑Hash类没有问题(只是确保你没有覆盖另一个方法,method_defined?
检查fe)
答案 1 :(得分:0)
class Hash
def pluralize_each
each { |key,value| puts "#{key.pluralize} => #{value.pluralize}" }
end
end
如果你想在Hash
个实例上调用自己的方法,我怀疑除了重新开课之外还有其他方法。
答案 2 :(得分:0)
在Ruby的面向对象范例中,制作Hash的子方法绝对是最好的方法。但是如果你想出于某种原因想要创建一个全局方法,那么有两种方法来检查参数类。
一个是“instance_of?” (测试参数是否属于特定类)或“kind_of?” (允许子类;通常是一个好主意)。例如:
{a: 1, b: 2, c: 3}.kind_of? Hash
是真的。
所以你可以用这种方式检查你的论点。另一个选项是“duck-typing”,看看对象是否像哈希一样,例如看看它是否有“.keys”方法:
{a: 1, b: 2, c: 3}.respond_to? :keys
我坚持将方法插入Hash类中,但是:
class Hash
def ...
end
end
或定义Hash的子类并将方法放在那里:
class Hash_with_plural < Hash
def ...
end
end
因为它更干净。