35630


`Hash#delete`が破壊的メソッドのせいで
`String#delete`が非破壊だと忘れてしまうことが良くあるので、`String#remove`のようなエイリアス関数を作ろうかと思ったのですが、既に存在した場合無駄なので特定のメソッドのエイリアスが現在の環境で既に用意されているかどうかを調べる方法が知りたいです。

今はGoogleで検索したりドキュメントでそれらしい関数がないか探しているのですが、もっと明確に特定のメソッドのエイリアス一覧を表示する方法はなにかないでしょうか？

### 追記

@sakuro さんに教えて頂いた `Object.instance_method` を使って書いてみました。

[code]

    class Object
      def self.method_aliases
        instance_methods.group_by do |i|
          instance_method(i)
        end.select { |k, v| v.size > 1 }.map { |k, v| v }
      end
    
      def self.aliases_of(method_symbol)
        method_aliases&.find { |i| i.include?(method_symbol) }&.reject { |i| i == method_symbol }
      end
    end
    
    Hash.aliases_of(:has_key?)
    # => [:include?, :key?, :member? ]
    
[/code]

ただ、Rails環境で試してみた所 `[:byebug,:debugger]` や `[:awesome_inspect, :ai]`など一部の
gemで拡張してるメソッドが拾えないようです。`group_by`の比較演算子の問題でしょうか…？


CC BY-SA 3.0
2017-06-14T20:20:42.470
35582
2017-06-16T05:32:29.780
2017-06-15T23:53:59.503
3271
3271
question
ruby
特定のメソッドのエイリアスがあれば表示する方法

[code]

    if String.method_defined?(:delete)
      class String
        alias :remove :delete
      end
    end
    
    puts "hello".remove "o" # hell
    
[/code]

`method_defined?` を使ってメソッドの存在をチェック出来ます。


CC BY-SA 3.0
2017-06-15T02:12:25.680
35591
2017-06-15T02:12:25.680
440
35582
answer

[code]

    Array.instance_methods.combination(2).select {|a,b|
      Array.instance_method(a) == Array.instance_method(b)
    }
    
[/code]

あたりの結果を使って判定できそうです。


CC BY-SA 3.0
2017-06-15T06:38:32.120
35597
2017-06-15T06:38:32.120
17037
35582
answer


コードとしてはダサいですが、 @ironsand さんのコードを元に `group_by` の問題を回避したら、それらしき結果が得られました。

[code]

    class Object
      def self.method_aliases
        instance_methods.group_by do |i|
          instance_method(i)
        end.select { |k, v| v.size > 1 }.map { |k, v| v }
      end
    
      def self.method_aliases
        grp = instance_methods.inject({}) do |h, i|
          k = h.keys.find { |e| e.eql?(instance_method(i)) }
          if k.nil? then h[instance_method(i)] = [i]
          else h[k] << i
          end
          h
        end
        grp.select { |_, v| v.size > 1 }.values
      end
    
      def self.aliases_of(method_symbol)
        method_aliases&.find { |i| i.include?(method_symbol) }&.reject { |i| i == method_symbol }
      end
    end
    
    puts "aliases of Hash#key? => #{Hash.aliases_of(:key?)}"
    # => aliases of Hash#key? => [:include?, :has_key?, :member?]
    puts "aliases of Array#byebug => #{Array.aliases_of(:byebug)}"
    # => aliases of Array#byebug => [:debugger]
    
[/code]


CC BY-SA 3.0
2017-06-16T05:32:29.780
35630
2017-06-16T05:32:29.780
23348
35582
answer