我对Ruby类一无所知

2020-11-22 08:57:28

我一直有这样的感觉,在学习Ruby和Rails时,有很多我不太了解的小概念。我习惯于写东西以学习它们,所以这里有一些简短的文章,介绍了我所不了解的内容。

类Class直接从Module继承,并向其添加与实例相关的所有行为。长话短说,模块用于向应用程序的一个或几个类添加方法,而类则用于管理对象的属性。

附言:此图非常非常简单,专注于Class,但是Module和Object还有很多其他子元素。

为了查看类的祖先,可以使用.superclass方法:

如果要查看特定类的所有超类,可以使用.ancestors方法:

在这里,数组包括Class的所有超类,这就是我们所谓的ruby中的祖先链。

在Ruby中,当您定义新类时,实际上是在创建Class类的实例。

例如,在这里,我们刚刚创建了一个名为Foo的新类,它是Class类的实例,我们可以使用竞争的Foo来访问该实例。按照这种逻辑,我们可以看到我们可以像偶然对象一样创建Foo:

class MyExample def say_hello将“ hello world”放置在末尾>> MyExample.ancestors => [MyExample,Object,Kernel,BasicObject] >> MyExample.new.say_hello => hello world >> MyExample.new.say_good_bye => NoMethodError

say_hello:当我们在MyExample类的实例上调用say_hello方法时,Ruby会在MyExample类中查找名为say_hello的方法,它将找到并返回适当的结果。

say_good_bye:如果我调用say_good_bye方法,ruby将在MyExample中查找该方法,它将找不到它,然后它将一次遍历每个父对象的祖先链,直到BasicObject找到一个名为say_good_bye的方法。

由于MyExample类或任何祖先都不存在say_good_bye方法,因此Ruby将返回NoMethodError。

可以使用include,extend和prepend方法将模块的代码添加到Class中。让我们关注两个第一,因为它们比较常见。

就像医生说的那样,当一个类包含一个模块时,模块的实例方法就可以用作该类的实例方法。

模块RandomModule def say_thank_you表示“谢谢”结束端类RandomClass包括RandomModule结束>> RandomClass.new.say_thank_you =>谢谢>> RandomClass.ancestors => [RandomClass,RandomModule,Object,Kernel,BasicObject]

在这里,您还可以看到,如果我们检查RandomClass的祖先链,则会显示RandomModule!

如我们先前所见,当我们调用模块的方法(say_thank_you)时,Ruby将在我们的RandomClass类中查找该方法,但找不到它,因此Ruby将遍历RandomClass类的每个祖先以找到该方法。 。

我一直发现模糊和扩展和包含之间的区别,但是它们实际上是非常不同的:扩展将模块的方法添加为类方法,而不是实例方法。

模块RandomModule def say_thank_you将'谢谢'结束端类RandomClass扩展RandomModule结束>> RandomClass.new.say_thank_you => NoMethodError >> RandomClass.say_thank_you =>谢谢>> RandomClass.ancestors => [RandomClass,Object,Kernel,BasicObject ]

如您所见,该模块与我们的RandomClass混合在一起,并且其方法不能在实例级别(RandomClass.new.method)上访问,而可以在类级别(RandomClass.method)上访问。

模块RandomModule def say_thank_you将'谢谢'结束结束类RandomClass结束>> RandomClass.new.say_thank_you => NoMethodError >> new_instance = RandomClass.new >> new_instance.extend RandomModule >> new_instance.say_thank_you =>谢谢

这意味着您始终可以添加和编辑特定祖先类的方法。您可以对自己创建的类甚至是Ruby的类进行此操作。

类字符串def tell_my_size self.size end def反向self.size end end >> my_string ='hello world'>> my_string.tell_my_size => 11 >> my_string.reverse => 11

我们在String类中添加了一个新方法,并且更改了reverse方法的行为。注意,用这种方法覆盖其他类当然是危险的!这样做要非常小心,并且总是喜欢直接编辑现有的类。

我知道课程周围还有很多其他概念,但这仅是本文的内容,请随时在注释中完善我的解释,以后我可能会在此处添加更多概念👀

also我还是stanza.dev的制造商,该公司可帮助开发人员更快地学习编码概念。随意看看👨‍💻 👩‍💻