首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >创建一个Hash方法

创建一个Hash方法
EN

Stack Overflow用户
提问于 2012-06-19 22:13:55
回答 3查看 216关注 0票数 0

因此,我有一个关于扩展常见Ruby数据类型功能的最佳实践问题。

所以Rails当然有一个很棒的方法pluralize,它接受一个字符串并将其复数。我特别感兴趣的是,您可以调用

代码语言:javascript
复制
"square".pluralize

并接收

代码语言:javascript
复制
=> "squares"

作为回报。我想做的是类似的事情--除了Hash。对于这个问题,假设我有一个方法pluralize_each,它将散列的每个keyvalue复数。

代码语言:javascript
复制
def pluralize_each hash
  hash.each {|key,value| puts key.pluralize + "=>" + value.pluralize }
end

我怎样才能操纵这个方法,这样我就可以在一个散列上调用它?例如,我希望能够调用

代码语言:javascript
复制
{"cat" => "dog"}.pluralize_each
#=> {"cats" => "dogs"}

(让我们忘记这个特定的方法现在并不是完全有效的,包括嵌套的散列等等。)

除了扩展Hash类之外,还有什么方法可以做到这一点吗?我想会有办法的。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-06-19 22:18:42

使用一个模块:

代码语言:javascript
复制
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合法地请求了类编辑vs模块扩展。这是我的观点:

如果你正在写一些有机的东西,模块可以用来优化重构/代码组织。示例:

代码语言:javascript
复制
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

这个模块允许你定义一种清晰的方式来定义各种类的复数;你可以添加一个配置,在不同的文件中分离复数方法等。

无论如何,如果您只想将一个pluralize方法添加到Hash类中,那么编辑Hash类是没有问题的(只要确保您不会用method_defined?检查F.E.覆盖另一个方法即可)。

票数 2
EN

Stack Overflow用户

发布于 2012-06-19 22:16:29

代码语言:javascript
复制
class Hash
  def pluralize_each
    each { |key,value| puts "#{key.pluralize} => #{value.pluralize}" }
  end
end

如果您想在Hash实例上调用自己的方法,除了重新打开类之外,我怀疑没有其他方法。

票数 0
EN

Stack Overflow用户

发布于 2012-06-20 02:23:08

考虑到Ruby的面向对象范式,创建Hash的子方法无疑是最好的方法。但是,如果您出于某种原因想要创建一个全局方法,那么有两种方法可以检查参数类。

一个是"instance_of?“(它测试参数是否属于特定的类)或"kind_of?“(它允许子类;通常是个好主意)。举个例子:

代码语言:javascript
复制
{a: 1, b: 2, c: 3}.kind_of? Hash

是真的。

所以你可以用这种方式检查你的论点。另一种选择是“鸭子类型”,看看对象是否像散列一样工作,例如,看看它是否有一个".keys“方法:

代码语言:javascript
复制
{a: 1, b: 2, c: 3}.respond_to? :keys

但是,我坚持将方法插入到Hash类中:

代码语言:javascript
复制
class Hash
  def ...
  end
end

或者定义一个Hash的子类,并将方法放在那里:

代码语言:javascript
复制
class Hash_with_plural < Hash
  def ...
  end
end

因为它干净多了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11102879

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档