类,它们的方法,它们的变量等对我来说都是一个非常新的概念,也是我难以完全掌握的东西.
我在教自己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一样?它只是语法""用于字符串,[]用于数组,{}用于哈希所以它假定我们正在谈论的是什么?
您正在寻找的概念是文字,但为了更详细地解释它,让我们从您的示例代码开始.
这段代码中实际上有两个不同的字符串:
x = String.new("Hi")
Run Code Online (Sandbox Code Playgroud)
"Hi"是一个字符串对象,然后创建并存储第二个字符串对象x.使用此等效代码可以更好地看到这一点:
y = "Hi"
x = String.new(y)
Run Code Online (Sandbox Code Playgroud)
在x与y变量保持两个不同的字符串对象,即使两个对象包含相同的内容.你可以通过修改其中一个,并检查另一个保持不变来证明它们是不同的
y.downcase!
y #=> "hi"
x #=> "Hi"
Run Code Online (Sandbox Code Playgroud)
考虑这段代码:
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.