gpt4 book ai didi

java - ruby 中的对象引用类型

转载 作者:数据小太阳 更新时间:2023-10-29 07:49:06 27 4
gpt4 key购买 nike

我是 Ruby 的新手,目前正在尝试使用我用作指南的 Ruby 书中的一些示例:

    class Account
attr_accessor :balance
def initialize(balance)
@balance = balance
end
end

class Transaction
def initialize(account_a, account_b)
@account_a = account_a
@account_b = account_b
end

def debit(account,amount)
account.balance -= amount
end
def credit(account,amount)
account.balance += amount
end

def transfer(amount)
debit(@account_a, amount)
credit(@account_b, amount)
end

end

savings = Account.new(100)
checking = Account.new(200)
trans = Transaction.new(checking, savings)
trans.transfer(60)

puts savings.balance
puts checking.balance

这是一个非常简单的示例,在同一个脚本文件中包含两个类。我对传递给贷方和借方方法的参数类型感到困惑。来自 Java,我仍然在类型方面,所以显然我传递给的帐户变量的类型,比如借记方法,必须是帐户类型。

由于 ruby​​ 是动态类型的并且不检查类型,我如何才能安全地操作我传递的参数,并通过以下语句定义方法的其余部分:account.balance -+ amount?

我试图理解,如果我向借记方法传递对 Account 以外的对象的引用,会有什么样的安全性?

定义下面方法的主体时,它使用给定的参数帐户。现在,我想我在重复自己,因为我仍然无法理解这个想法......我如何接受参数 account (可以是任何类型,因为没有人检查)和通过使用点运算符构建一些逻辑,请求它的实例变量,或调用它的其他方法,并对可能是或可能不是正确种类(或类型)的对象执行计算?当然,隐含地,我希望它是帐户类型。

def credit(account,amount)
account.balance += amount
end

此外,如果我在不同的文件中声明这两个类,同一个示例将如何工作?

真诚地为新手问题提前道歉,我发现很难全神贯注于动态类型——或者更好的是,没有类型检查。这本书要么在这方面有点含糊,要么我无法通过只用 Java 思考来摆脱我的狭隘视野。

任何实用的解释将不胜感激。

最佳答案

Ruby 中没有任何类型安全。对 Ruby 来说重要的是一个对象是否可以响应它接收到的消息。你可以传递一些完全没有意义的东西,此时 Ruby 不会做任何事情来阻止你。但是,如果您传入的对象不响应您发送的消息(在本例中为 + 和 -),则当您的代码尝试发送无效消息时,您将收到 NoMethodError。

一般来说,解决方法是:不要传入错误的类型。它知道这听起来很弱,但这正是您需要做的——确保您传递的是正确的东西。为您的程序编写测试以确保您正在做您想要做的事情。 Ruby 非常擅长单元测试。如果你真的担心一个参数是正确的类型,你可以显式检查它的类(raise 'WTF?' unless object.class == String)或者你可以尝试转换它到正确的类(通过定义 to_foo 类型的方法)。

作为返回,您基本上不用关心类型。只要对象响应您发送的消息,您传入的内容并不重要。这使得模拟和代理之类的事情变得非常简单。

关于java - ruby 中的对象引用类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1475048/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com