Казвам, че зареждам някой код 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)
е, че показва методи, включени от суперкласовете, методи, включени от модулите, и методи, които са дефинирани динамично. Също така, обикновено имате обект които инспектирате, а не клас.