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

标签 ruby

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

我正在自学 Ruby,这个话题令人沮丧,所以我决定换个角度看问题。

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

例子

**字符串 - 类

“嗨,我的名字是……”- 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 类的实例方法。

两个问题

这是查看类(class)的好方法吗?当我遇到更大的问题时,比如创建一个包含多个类的井字游戏(我现在正在做)时,我有时会感到头疼。这令人沮丧,因为我觉得自己很愚蠢(也许我应该习惯这一点),但我在这里自责。我很轻松地进行了代码大战,并用一种​​方法解决了大量问题。我知道某个地方是否可以将其与类(class)联系起来,我会更好地理解。卡住时查看解决方案代码是自学的最佳方法吗?我没有人可以问,我想保留尽可能多的信息。

其次,Ruby 如何知道一个字符串是一个字符串,一个数组是一个数组,一个哈希是一个哈希,这样我就可以定义这些变量而不是像为 Cat 那样调用 .new?它只是字符串的语法“”,数组的[],散列的{},所以它假设这就是我们正在谈论的内容?

最佳答案

您要查找的概念是 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 创建它.

关于ruby - Ruby(或其他语言)如何隐式知道哪个对象属于哪个内置类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44600669/

相关文章:

ruby-on-rails - Rails sprockets 不预编译 Assets

arrays - 从 Ruby 中的嵌套哈希和数组中提取值

ruby-on-rails - 在 Ruby on Rails 中获取项目中的文件名

ruby-on-rails - 在任何来源中都找不到 rake-10.4.2 (Bundler::GemNotFound)

ruby-on-rails - 使用 rspec 测试 Rails Controller

ruby-on-rails - 如何在 ruby​​ in rails 中创建复杂的 Json 响应

ruby - ""(两个双引号)在 Ruby 中有什么作用?

ruby-on-rails - 如何使用 ruby​​ 2.0 运行 Ruby on Rails 3

Ruby:如何卸载 Devise?

ruby - Ruby 中的 java 接口(interface)等价物是什么?