首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重载ActiveSupport的默认to_sentence行为

重载ActiveSupport的默认to_sentence行为
EN

Stack Overflow用户
提问于 2009-08-26 11:49:40
回答 2查看 1.1K关注 0票数 2

ActiveSupport提供了很好的to_sentence方法。因此,

代码语言:javascript
复制
require 'active_support'
[1,2,3].to_sentence  # gives "1, 2, and 3"
[1,2,3].to_sentence(:last_word_connector => ' and ')  # gives "1, 2 and 3"

很好,您可以更改最后一个单词连接器,因为我不喜欢有额外的逗号。但这需要大量额外的文字:44个字符,而不是11个!

问题:将:last_word_connector的默认值更改为' and '的最类似红宝石的方法是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-08-26 13:03:24

作为一般情况下如何重写方法的答案,post 这里提供了一种很好的方法。它不存在与别名技术相同的问题,因为没有剩余的“旧”方法。

在这里,您如何使用该技术来解决原来的问题(用ruby1.9进行测试)

代码语言:javascript
复制
class Array
  old_to_sentence = instance_method(:to_sentence)
  define_method(:to_sentence) { |options = {}|

    options[:last_word_connector] ||= " and "
    old_to_sentence.bind(self).call(options)
  }
end

如果上面的代码令人困惑,您也可能需要阅读UnboundMethod。请注意,old_to_sentence在end语句之后超出了作用域,因此对于数组的未来使用来说,这并不是一个问题。

票数 -1
EN

Stack Overflow用户

发布于 2009-08-26 12:16:36

代码语言:javascript
复制
 class Array
   alias_method :old_to_sentence, :to_sentence
   def to_sentence(args={})
     a = {:last_word_connector => ' and '}
     a.update(args) if args
     old_to_sentence(a)
   end
 end
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1334168

复制
相关文章

相似问题

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