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

han*_*cho 3 ruby

类,它们的方法,它们的变量等对我来说都是一个非常新的概念,也是我难以完全掌握的东西.

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

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

**字符串 - 类

"嗨,我的名字是...." - String类的实例.

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

"Hi my name is....".length => 17
Run Code Online (Sandbox Code Playgroud)

我可以创造

x = String.new("Hi")
Run Code Online (Sandbox Code Playgroud)

但我也可以创造

x = "Hi"
Run Code Online (Sandbox Code Playgroud)

两者都是一样的

如果我创建了一个猫类

class Cat 
  attr_reader :name

  def initialize(name)
    @name = name 
  end 

end

jinx = Cat.new("Jinx")
print jinx.name => Jinx
Run Code Online (Sandbox Code Playgroud)

我们在这里

猫级

"Jinx" - Cat类的实例.

.name - Cat类的实例方法.

两个问题

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

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

Tom*_*ing 7

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

String.new

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

x = String.new("Hi")
Run Code Online (Sandbox Code Playgroud)

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

y = "Hi"
x = String.new(y)
Run Code Online (Sandbox Code Playgroud)

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

y.downcase!
y #=> "hi"
x #=> "Hi"
Run Code Online (Sandbox Code Playgroud)

Cat.new

考虑这段代码:

jinx = Cat.new("Jinx")
Run Code Online (Sandbox Code Playgroud)

如果你说那"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
Run Code Online (Sandbox Code Playgroud)

区别

两者之间的区别在于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.