类、它们的方法、它们的变量等对我来说是一个非常新的概念,也是我难以完全掌握的东西。
我正在自学 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)
x
和 y
变量持有两个不同的字符串对象,即使这两个对象包含相同的内容。您可以通过修改其中一个并检查另一个保持不变来证明它们不同
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/