Ruby(或其他语言)如何隐式知道哪个对象属于哪个内置类?

时间:2017-06-17 04:09:46

标签: ruby

课程,他们的方法,他们的变量等对我来说是一个非常新的概念,也是我难以完全掌握的东西。

我正在教自己Ruby,这个话题令人沮丧,所以我决定以不同的方式看待事物。

我意识到我从第一天起就一直在使用类,实例变量和实例方法。

示例

** String - class

“我的名字是......” - String类的实例。

.length - 我可以在上面的实例上调用的String类的实例方法。

"Hi my name is....".length => 17

我可以创建

x = String.new("Hi")

但我也可以创建

x = "Hi"

两者都是相同的

如果我创建了猫类

class Cat 
  attr_reader :name

  def initialize(name)
    @name = name 
  end 

end

jinx = Cat.new("Jinx")
print jinx.name => Jinx

我们有

猫级

“Jinx” - Cat类的实例。

.name - Cat类的实例方法。

两个问题

这是查看课程的好方法吗?当我遇到更大的问题,比如创建一个有多个课程的tic tac toe游戏(我现在正在做的)时,我觉得有时会感到头疼。这令人沮丧,因为我感到愚蠢(也许我应该习惯),但我在这里打败自己。我有一个非常容易的时间进行代码大战并用单一方法解决大量问题。我知道某个地方,如果我能把它与课程联系起来,我会更好地理解。在坚持自学的最佳方式时,是否正在寻找解决方案代码?我没有人要问,我希望保留尽可能多的信息。

第二,Ruby如何知道String是一个String,一个Array是一个数组,一个Hash a Hash所以我可以定义那些变量而不是调用.new就像我对Cat一样?它只是语法“”用于字符串,[]用于数组,{}用于哈希所以它假定我们正在谈论的是什么?

2 个答案:

答案 0 :(得分:7)

您正在寻找的概念是Literals,但为了更详细地解释它,让我们从您的示例代码开始。

String.new

此代码中实际上有两个不同的字符串:

x = String.new("Hi")

"Hi"是一个字符串对象,然后创建一个第二个字符串对象并存储在x中。使用此等效代码可以更好地看到这一点:

y = "Hi"
x = String.new(y)

xy变量包含两个不同的字符串对象,即使两个对象包含相同的内容。您可以通过修改其中一个来检查它们是不同的,并检查另一个是否保持不变

y.downcase!
y #=> "hi"
x #=> "Hi"

Cat.new

考虑此代码:

jinx = Cat.new("Jinx")

如果您说"Jinx"Cat,那就不太对了。 "Jinx"仍然是一个字符串。 Cat.new将创建一个新的Cat对象,它会将"Jinx"字符串存储在对象中。

你可以更清楚地看到这种差异:

# this is a string
name = "Jinx"
name.length #=> 4

 # this is a Cat, with a string inside it
jinx = Cat.new(name)
jinx.name #=> "Jinx"
jinx.name.length => 4

差异

两者之间的区别在于Ruby有字符串文字但不是 Cat文字

文字是一个对象,您可以在其中键入代码,而无需使用new实际创建它。以下是一些文字的例子:

  • "Hello"生成String对象
  • 5制作Integer对象
  • 5.5生成Float对象
  • []制作Array对象
  • {}生成Hash对象

您可以在此处查看完整的Ruby文字列表:https://ruby-doc.org/core-2.3.0/doc/syntax/literals_rdoc.html

Cat个对象没有文字,因为它是您自己创建的自定义类。我不能只输入类似<Jinx>的内容来创建Cat对象,因为Ruby不会理解 - 我必须使用Cat.new创建它。

答案 1 :(得分:1)

  1. 不要因此而殴打自己。我知道这感觉压倒一切。它发生了。当你自学并且没有其他人知道它可以帮助你时,它会发生更多。编程很棘手,只是野兽的本质。

  2. 我不认识Ruby,但是关于编程的好处是只有大约15%的人知道语言和编码的大量思考过程(以及更多的调试)所以我不需要在这里帮助你它根据您声明的语法或“......”,[]和{}

  3. 等符号知道您使用的是什么