/ / Как да получите списък с САМО моите методи в IRB? - рубин

Как да получа списък само на моите налични методи в IRB? - рубин

Казвам, че зареждам някой код irb като следните:

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

Как мога да получа списък с само наличните ми методи? Ако бягам MyClass.new.methods Ще се върна всичко от наличните instance methods.

Бих искал просто да видя: :m, :a

Освен това, какво, ако моята methods не са опаковани в. \ t class?

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

Как да видя какво е налично? self.methods (Бягане: methods) дори не изброява моите методи.

Отговори:

1 за отговор № 1

Направете както е посочено по-долу Module#instance_methods:

Връща масив, съдържащ имената напублични и защитени методи в приемника. За модул това са публични и защитени методи; за даден клас те са методите (не единични). Без аргумент или с аргумент, който е невярен, методите на инстанцията в mod се връщат, в противен случай методите в superclasses на mod и mod се връщат.

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

Ако сте дефинирали методите на най-високо ниво като по-долу, те ще станат частен методите на Object клас. Така че бих използвал тогава Module#private_instance_methods

Връща списък с методите на частни инстанции, определени в mod. Ако незадължителният параметър не е фалшив, са включени методите на всички предци.

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

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

1 за отговор № 2

Това е малък трик, който често използвам, особено ако се опитвам да работя с обект от библиотека, който не съм написал:

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

Броя 0 има малък набор от методи, които са предимно стандартни неща от Ruby, които не искате да видите Object.new вместо 0 и това би било по-добре, защото бихте могли да видите подобни методи succ, но би било по-типично.

Предимството на това свърши MyClass.instance_methods(false) е, че показва методи, включени от суперкласовете, методи, включени от модулите, и методи, които са дефинирани динамично. Също така, обикновено имате обект които инспектирате, а не клас.