代码之家  ›  专栏  ›  技术社区  ›  nonopolarity

在Ruby中,过滤对象中包含单词“time”的所有方法的好方法是什么?

  •  3
  • nonopolarity  · 技术社区  · 14 年前

    我尝试了以下方法,但部分奏效:

    >> s.methods.map {|n| n if n =~ /time/}
    => [nil, nil, nil, nil, nil, nil, nil, nil, "skip_time_zone_conversion_for_attri
    butes", nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ni
    l, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ni
    l, "timestamped_migrations", nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, n
    il, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, n
    il, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, n
    il, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, n
    il, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, "time_zone_aware
    _attributes", nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, n
    il, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, "default_timezone", nil, n
    il, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, n
    il, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, n
    il, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, n
    il, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, "recor
    d_timestamps", nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil,
    nil, nil, nil, nil, nil, nil, nil]
    
    >> s.methods.each {|n| p n if n =~ /time/}
    "skip_time_zone_conversion_for_attributes"
    "timestamped_migrations"
    "time_zone_aware_attributes"
    "default_timezone"
    "record_timestamps"
    => ["extended_by", "before_create", "vote_ids=", "save_without_dirty", "_delete"
    , "touch", "daemonize", "after_destroy", "skip_time_zone_conversion_for_attribut
    es", "methods", "send", "to_query", "becomes", "after_validation", "store_full_s
    ti_class?", "save_with_transactions!", "autosave_associated_records_for_votes",
    "require_library_or_gem", "enum_for", "taint", "instance_variable_defined?", "ac
         [...] and the rest of the whole array
    
    >> s.methods.filter {|n| n =~ /time/}
    NoMethodError: undefined method `filter' for #<Array:0x4de6b00>
            from (irb):93
    
    3 回复  |  直到 14 年前
        1
  •  15
  •   nonopolarity    14 年前

    grep 另一个简单的方法是:

    1.9.0 > require 'date'
     => true 
    1.9.0 > x = Date.new
     => #<Date: -1/2,0,2299161> 
    1.9.0 > x.methods.grep /time/
     => ["ctime", "asctime", "strftime"] 
    

    用你尝试过的方法:

    map 将给定的块应用于给定可枚举的每个元素,返回一个新的可枚举。这不是你想要的(如你所见)。

    methods.each

    matching_methods = []
    s.methods.each {|m| matching_methods << m if m =~ /time/}
    

    /time/ matching_methods

    s.methods.select { |m| m =~ /time/ }
    

    更可取。

    最后, filter 在Ruby中不存在;那是什么 select find_all

        2
  •  4
  •   YOU    14 年前

    使用 Enumerable.select

     s.methods.select{|n| n=~/time/}
    

    grep

    s.methods.grep(/time/)
    
        3
  •  2
  •   Eimantas    14 年前

    这是你的方法 compact :

    s.methods.map{|n| n if n =~ /time/}.compact