【发布时间】:2009-09-25 01:48:35
【问题描述】:
我是 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
这是一个非常简单的示例,在同一个脚本文件中包含两个类。我对传递给 credit 和 debit 方法的参数类型感到困惑。来自 Java,我仍然在考虑类型,所以很明显,我传递给的 account 变量的类型,比如 debit 方法,必须是 Account 类型。
由于 ruby 是动态类型的并且不检查类型,我如何安全地对我传递的参数进行操作,并通过以下方式定义方法的其余部分: account.balance -+ amount ?
我想了解,如果我将对 Account 以外的对象的引用传递给 debit 方法,会有什么样的安全性?
当定义以下方法的主体时,它使用给定的参数帐户。现在,我想我在重复自己,因为我仍然无法理解这个想法......我该如何接受参数 account (可以是任何类型,因为没有人在检查)和通过使用点运算符构建一些逻辑,询问其实例变量,或调用其其他方法,并对可能或可能不是正确种类(或类型)的对象执行计算?当然,隐含地,我希望它是 Account 类型。
def credit(account,amount)
account.balance += amount
end
另外,如果我在不同的文件中声明这两个类,同一个示例将如何工作?
对于新手问题,我提前致以诚挚的歉意,我只是发现我很难将我的思想包裹在动态类型上——或者更好的是,没有类型检查。这本书要么在这方面有点模糊,要么我无法通过仅用 Java 思考来动摇我的视野。
任何实用的解释将不胜感激。
【问题讨论】:
-
不需要为这个问题道歉。这是一个很好的问题,也是一个有效的担忧。 Ruby 消除了您在其他语言中获得的大量编译时保证,以换取运行时更大的灵活性。
标签: java ruby variables dynamic-typing