加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – ruby??中的对象引用类型

发布时间:2020-12-15 08:30:53 所属栏目:Java 来源:网络整理
导读:我是 Ruby新手,目前正在尝试使用 Ruby书中的一些例子作为指南: class Accountattr_accessor :balancedef initialize(balance) @balance = balanceend endclass Transactiondef initialize(account_a,account_b)@account_a = account_a@account_b = account_
我是 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,我仍然在类型方面,所以很明显我传递给帐户变量的类型,比如借记方法,必须是Account类型.

由于ruby是动态类型的,并且没有检查类型,我如何安全地操作我传递的参数,并通过说:account.balance – amount来定义方法的其余部分?

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

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

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

另外,如果我在不同的文件中声明这两个类,那么同样的例子会如何工作?

真诚地为新手问题道歉,我发现很难围绕动态打字 – 或者更好,没有类型检查.这本书要么有点模糊,要么我只能用java思考,不能动摇我的隧道视野.

任何实际的解释将不胜感激.

解决方法

Ruby中没有任何类型安全性.对Ruby而言,最重要的是对象是否可以响应它收到的消息.你可以传递一些完全没有意义的东西,Ruby也不会做任何事情来阻止你.但是如果传入的对象不响应您正在发送的消息(在这种情况下),当代码尝试发送无效消息时,您将收到NoMethodError.

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

作为回报,你基本上不再关心类型.只要对象响应你发送的消息,你输入的内容就没关系.这使得模拟和代理之类的东西变得非常简单.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读