【问题标题】:How can I write a method parameter when I'm calling another method?当我调用另一个方法时,如何编写方法参数?
【发布时间】:2020-10-22 05:25:16
【问题描述】:

对不起,我是 Ruby 的大初学者,我不知道我的标题和我的问题是否有意义......

这是我的代码:

class Account
  attr_reader :name, :balance
  def initialize(name, balance=100)
    @name = name
    @balance = balance
  end

  def display_balance
    pin_check
    puts "Hello #{name} ! Your balance is $ #{balance}."
  end

  private
  def pin
    @pin = 1234
  end

  def pin_check(pin_number)
    if @pin_number == @pin
      puts "Access authorized: pending transaction"
    else puts "Access denied: wrong PIN"
    end
  end
end

checking_account = Account.new("Saitama", 20_000)
checking_account.display_balance

我正在尝试做的是在其他方法中自动执行“pin check”。我的问题是 pin_check 参数:当然,程序期待这个方法的参数,但是在我的最后一行代码中,我不知道如何给它预期的 1234 参数......有什么方法可以正确编写最后一行代码链接 display_balance 和 pin_check 以便为 pin_check 提供好的参数?

我在想也许可以写一些类似的东西,但我知道它不起作用:

checking_account.display_balance.pin_check(1234)

如何链接两者?非常感谢您的帮助!

【问题讨论】:

    标签: ruby parameters


    【解决方案1】:

    我认为最简单的做法是在构造函数中执行pin_check,然后您不必担心对所有方法都执行此操作。 pin_number 将是一个构造函数参数。

    另一种选择是使用 ActiveModel::Validations 之类的东西,并添加一个检查 PIN 的验证器。在执行任何操作之前,您班级的任何客户都需要知道validate。这就是 Rails 工具(如 ActiveRecord)使用的模式。

    【讨论】:

    • 感谢您的回答 :) 对不起,我是一个大初学者,我不确定您所说的“构造函数参数”是什么意思...您的意思是在 @ 987654325@方法?关于您的第二个选项,我想我现在无法弄清楚。不幸的是,我的 Ruby 技能非常低 :(
    • pin_number == pin替换@pin_number == @pin
    • 是的@Monsieur_Sboob 我的意思是将pin_number 作为参数传递给initialize,并立即在初始化方法的主体中执行验证检查。
    • 完美运行,感谢您的帮助! :) 好吧,这确实是最好的方法,我要试试!
    【解决方案2】:

    您可以将 pin 传递给 display_balance 并传递给 pin_check

      def display_balance(pin:)
        pin_check(pin)
        puts "Hello #{name} ! Your balance is $ #{balance}."
      end
    
    checking_account = Account.new("Saitama", 20_000)
    checking_account.display_balance(pin: 1234)
    

    请注意,因为pin_check 只打印,所以将始终显示余额。你可能想要raise an exception

      def pin_check(pin_number)
        raise "Access denied: wrong PIN" unless pin_number == pin
      end
    

    请注意,它是 pin_number 而不是 @pin_numberpin_number 是包含传递给 pin_check 的内容的变量。 @pin_number 是存储在对象上的 "instance variable"

    更新:还要注意它是pin 而不是@pin。除非调用 pin,否则不会设置 @pin


    最好在对象初始化期间将 pin 传递一次,如果不匹配则引发错误。这保证了没有引脚检查就不会发生任何操作。

      attr_reader :name, :balance
      def initialize(name:, balance: 100, pin:)
        @name = name
        @balance = balance
    
        pin_check(pin)
      end
    
      private def pin_check(pin_try)
        raise "Access denied: wrong PIN" unless pin_try == @pin
      end
    
    checking_account = Account.new(name: "Saitama", balance: 20_000, pin: 1234)
    checking_account.display_balance
    

    请注意,我使用的是named arguments。这使您可以添加参数,甚至是可选参数,而无需记住参数 3 是什么。

    【讨论】:

    • 感谢您的回答,这非常有帮助,我学到了很多东西:) 但是我仍然无法弄清楚为什么(在您的第一个示例中)控制台甚至显示“访问授权”如果我调用了错误的参数(例如:1235 而不是 1234),有什么想法吗?明天我会试试你评论的第二部分!它似乎确实更有效率;)
    • @Monsieur_Sboob 可能是因为您仍在使用if @pin_number == @pin,所以两者都不会被定义。答案的前半部分解释了原因。
    • 这就是问题所在!我在您的帮助下修复了它,非常感谢 :) 当我应该使用 @@@$ 时,我仍然有点困惑!现在更清楚了!
    • @Monsieur_Sboob 这更容易。你永远不想使用@@$。两者都最好用常量和类实例变量(类本身是一个对象,可以有实例变量)。
    【解决方案3】:

    您基本上需要在任何需要的地方传递 pin。您可以将 pin 传递给以下方法

    def display_balance(pin)
        pin_check(pin)
        puts "Hello #{name} ! Your balance is $ #{balance}."
      end
    

    现在您可以拨打checking_account.display_balance(1234)

    【讨论】:

    • 感谢您的帮助!但是,当我尝试为参数提供“1235”而不是“1234”时,控制台仍然显示“访问授权:待处理事务”而不是“访问被拒绝:错误 PIN”。你知道为什么吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-13
    • 1970-01-01
    • 2018-09-03
    • 1970-01-01
    • 2015-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多