In Ruby, what is a good way to filter all the methods of an object that contain the word "time" in it?

I tried the following and it partially worked:

>> 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
source share
3 answers

grep is another easy way to do this:

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"] 

Using the approaches you tried:

mapapplies this block to each element of a given enumerated type, returning a new enumerated. This is not what you wanted here (as you saw).

methods.eachkind of work, but obviously just printing the results is not very useful. This would be completely different from Ruby, but you could do:

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

to accumulate each method corresponding /time/to an array matching_methods. Of course, if you do this, then

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

.

, filter Ruby; select ( find_all).

+13

Enumerable.select

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

grep

s.methods.grep(/time/)
+4

Here is your approach with compact:

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

Source: https://habr.com/ru/post/1746812/


All Articles