Class: Array

Inherits:
Object show all
Defined in:
lib/awesome_print_motion/core_ext/array.rb

Overview

Copyright © 2010-2012 Michael Dvorkin

Awesome Print is freely distributable under the terms of MIT license. See LICENSE file or www.opensource.org/licenses/mit-license.php


The following makes it possible to invoke awesome_print while performing operations on method arrays, ex:

ap [].methods - Object.methods
ap ''.methods.grep(/!|\?/)

If you could think of a better way please let me know :-)

Instance Method Summary collapse

Instance Method Details

#grep(pattern, &blk) ⇒ Object



33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
# File 'lib/awesome_print_motion/core_ext/array.rb', line 33

def grep(pattern, &blk)
  #
  # The following looks rather insane and I've sent numerous hours trying
  # to figure it out. The problem is that if grep gets called with the
  # block, for example:
  #
  #    [].methods.grep(/(.+?)_by/) { $1.to_sym }
  #
  # ...then simple:
  #
  #    original_grep(pattern, &blk)
  #
  # doesn't set $1 within the grep block which causes nil.to_sym failure.
  # The workaround below has been tested with Ruby 1.8.7/Rails 2.3.8 and
  # Ruby 1.9.2/Rails 3.0.0. For more info see the following thread dating
  # back to 2003 when Ruby 1.8.0 was as fresh off the grill as Ruby 1.9.2
  # is in 2010 :-)
  #
  # http://www.justskins.com/forums/bug-when-rerouting-string-52852.html
  #
  # BTW, if you figure out a better way of intercepting Array#grep please
  # let me know: twitter.com/mid -- or just say hi so I know you've read
  # the comment :-)
  #
  arr = unless blk
    original_grep(pattern)
  else
    original_grep(pattern) do |match|
      #
      # The binding can only be used with Ruby-defined methods, therefore
      # we must rescue potential "ArgumentError: Can't create Binding from
      # C level Proc" error.
      #
      # For example, the following raises ArgumentError since #succ method
      # is defined in C.
      #
      # [ 0, 1, 2, 3, 4 ].grep(1..2, &:succ)
      #
      eval("%Q/#{match.to_s.gsub('/', '\/')}/ =~ #{pattern.inspect}", blk.binding) rescue ArgumentError
      yield match
    end
  end
  if self.instance_variable_defined?('@__awesome_methods__')
    arr.instance_variable_set('@__awesome_methods__', self.instance_variable_get('@__awesome_methods__'))
    arr.reject! { |item| !(item.is_a?(Symbol) || item.is_a?(String)) } # grep block might return crap.
  end
  arr
end

#original_grepObject

Intercepting Array#grep needs a special treatment since grep accepts an optional block.



32
# File 'lib/awesome_print_motion/core_ext/array.rb', line 32

alias :original_grep :grep