【问题标题】:How to get *all* classes in Pharo?如何在 Pharo 获得*所有*课程?
【发布时间】:2017-01-16 15:41:04
【问题描述】:

难题...在Kernel-Traits 中尝试过Smalltalk allClassesTBehaviour 似乎不在列表中。有趣的是,它是Trait 而不是Class...?似乎有对应的allTraits allBehaviors

在尝试获取所有内容时我们应该了解的其他任何信息?还是有其他方法可以获取所有内容?

【问题讨论】:

    标签: reflection smalltalk pharo


    【解决方案1】:

    你需要执行:

    Smalltalk allClassesAndTraits.
    

    【讨论】:

    • 我试了一下。我有一些类似于“Smalltalk globals allBehaviors”的东西......有趣的是,你的返回 5801 个对象,我的返回 11602,正好是两次。嗯
    • @unmircea 其中一半是元类(因为每个类都有一个元类)...你可以从他们的名字看出Something class
    • 我明白了。明白了!!
    【解决方案2】:

    注意:我认为反射在某些 Pharo 书籍中有所描述,但我没有在任何书中看到它,因此无法指导您进一步阅读。?

    类是对象

    您始终可以对 Pharo 对象使用反射,这可能会让您更深入地了解您实际寻找的内容。

    任何类也是一个对象,任何对象都可以理解消息allSubclasses(或withAllSubclasses),它会给你...子类。

    Object willAllSubclasses

    请注意,上面还将为您提供“类端”类(每个类的元类实例),因为它们也是对象;所以

    Smalltalk allClasses asSet =¹ (ProtoObject withAllSubclasses \ Class allSubclasses) asSet
    "or"
    Smalltalk allClasses asSet = (ProtoObject withAllSubclasses \ Metaclass allInstances) asSet
    

    特征不是类

    Trait 是一个类,但TBehavior 不是;相反,它是Trait实例

    所以你可以说

    Trait allSubclasses. "an OrderedCollection()"
    Trait allInstances. "{... TBehavior. TClass. ...}"
    

    ¹SMarkCompilerTargetClass 是一些特殊的雪花。

    【讨论】:

    • 在我看来,我将它们都视为方法的“组”,事实上它们还为这些方法提供了对变量的访问权限,这对我来说无关紧要。我真正想要的是所有方法实现,因为每个方法实现都在一个这样的“组”下(称它为类、特征或其他),这意味着我需要所有这些“组”的列表。除非有另一种方法可以获取系统中的所有方法实现?!
    • @unmircea 你问的是类,现在你问的是实现。如果你想获得选择器#sum 的实现者,你可以问。 #sum implementors
    • 很好的类是我所追求的,然后是每个类的所有方法。设法修复它!
    猜你喜欢
    • 2013-06-13
    • 1970-01-01
    • 1970-01-01
    • 2022-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多