/ / Como obter uma lista dos APENAS meus métodos disponíveis no IRB? - rubi

Como obter uma lista de SOMENTE meus métodos disponíveis no IRB? - rubi

Digamos que eu carregue algum código no irb como o seguinte:

class MyClass
def m
#... something
end
def a
#... something
end
end

Como posso obter uma lista de meus métodos disponíveis? Se eu correr MyClass.new.methods eu voltei todos dos disponíveis instance methods.

Gostaria apenas de ver: :m, :a

Além disso, e se meu methods não estão envoltos em class?

def x
#... something
end
def z
#... something
end

Como vejo o que está disponível? self.methods (corrida: methods) nem lista meus métodos.

Respostas:

1 para resposta № 1

Faça como abaixo usando Module#instance_methods:

Retorna uma matriz contendo os nomes dosmétodos de instância pública e protegida no receptor. Para um módulo, esses são os métodos público e protegido; para uma classe, eles são os métodos de instância (não singleton). Sem argumento, ou com argumento falso, os métodos de instância em mod são retornados, caso contrário, os métodos nas superclasses de mod e mod são retornados.

class MyClass
def m
#... something
end
def a
#... something
end
end
MyClass.instance_methods(false)
# => [:m, :a]

Se você definiu métodos no nível superior, como abaixo, eles se tornarão privado métodos de instância do Object classe. Então eu usaria então Module#private_instance_methods

Retorna uma lista dos métodos de instância privada definidos no mod. Se o parâmetro opcional não for falso, os métodos de qualquer ancestral serão incluídos.

def x
#... something
end
def z
#... something
end

Object.private_instance_methods(false)
# => [:x, :z]

1 para resposta № 2

Esse é um pequeno truque que costumo usar, principalmente se estou tentando trabalhar com um objeto de uma biblioteca que não escrevi:

obj = MyClass.new
obj.methods.sort - 0.methods   # => [:a, :m]

O número 0 tem um pequeno conjunto de métodos que são basicamente apenas coisas Ruby padrão que você não deseja ver. Object.new ao invés de 0 e isso seria melhor porque você seria capaz de ver métodos como succ, mas seria mais digitado.

A vantagem disso sobre MyClass.instance_methods(false) é que mostra métodos incluídos nas superclasses, métodos incluídos nos módulos e métodos que foram definidos dinamicamente. Além disso, você normalmente tem um objeto que você está inspecionando em vez de uma classe.