Ruby 我可以从另一个类中的方法实例化一个类吗?(红宝石)

Ruby 我可以从另一个类中的方法实例化一个类吗?(红宝石),ruby,class,instantiation,irb,Ruby,Class,Instantiation,Irb,我重做了这个问题,并包含了两个文件的完整代码。在touch_In方法中,我试图在名为“touche”的变量中实例化一个旅程类 require_relative 'journey' class Oystercard MAXIMUM_BALANCE = 90 MINIMUM_BALANCE = 1 MINIMUM_CHARGE = 1 def initialize @balance = 0 @journeys = {} end def top_up

我重做了这个问题,并包含了两个文件的完整代码。在touch_In方法中,我试图在名为“touche”的变量中实例化一个旅程类

require_relative 'journey'

class Oystercard

  MAXIMUM_BALANCE = 90

  MINIMUM_BALANCE = 1

  MINIMUM_CHARGE = 1

  def initialize
    @balance = 0
    @journeys = {}
  end

  def top_up(amount)
    fail 'Maximum balance of #{maximum_balance} exceeded' if amount + balance > MAXIMUM_BALANCE
    @balance += amount
  end

  def in_journey?
    @in_journey
  end

  def touch_out(station)
    deduct(MINIMUM_CHARGE)
    @exit_station = station
    @in_journey = false
    @journeys.merge!(entry_station => exit_station)
  end

  def touch_in(station)
    fail "Insufficient balance to touch in" if balance < MINIMUM_BALANCE
    journey = Journey.new
    @in_journey = true
    @entry_station = station
  end

  attr_reader :journeys

  attr_reader :balance

  attr_reader :entry_station

  attr_reader :exit_station

  private

  def deduct(amount)
    @balance -= amount
  end

end
我认为“touch_in”方法应该创建一个我调用方法的“旅程”变量,例如“finish(station)”或“active”等。当我尝试在IRB中执行此操作时,我会遇到以下错误:

2.6.3 :007 > journey
Traceback (most recent call last):
        4: from /Users/jamesmac/.rvm/rubies/ruby-2.6.3/bin/irb:23:in `<main>'
        3: from /Users/jamesmac/.rvm/rubies/ruby-2.6.3/bin/irb:23:in `load'
        2: from /Users/jamesmac/.rvm/rubies/ruby-2.6.3/lib/ruby/gems/2.6.0/gems/irb-1.0.0/exe/irb:11:in `<top (required)>'
        1: from (irb):7
NameError (undefined local variable or method `journey' for main:Object)
2.6.3:007>旅程
回溯(最近一次呼叫最后一次):
4:from/Users/jamesmac/.rvm/rubies/ruby-2.6.3/bin/irb:23:in`'
3:from/Users/jamesmac/.rvm/rubies/ruby-2.6.3/bin/irb:23:in'load'
2:from/Users/jamesmac/.rvm/rubies/ruby-2.6.3/lib/ruby/gems/2.6.0/gems/irb-1.0.0/exe/irb:11:in`'
1:from(irb):7
NameError(未定义的局部变量或main:Object的“旅程”方法)
我知道上面的大部分代码都写得很草率,除了“旅程”问题之外,可能还有其他一些代码是不正确的。如果是这样,请告诉我,告诉我的越多越好

向第一次尝试帮助我的人道歉,因为我说我仍然习惯于这样做,并试图让这篇文章更容易阅读

class Journey
    # ...
    def initialize
        puts "Journey initialized"
      # ...
    end
    # ...
  end


require_relative 'journey'

class Oystercard

    def initialize
    end
    # ...
    def touch_in(station)
      journey = Journey.new
      # ...
    end
  end

  Oystercard.new.touch_in("station")
stack_question$ruby oystercard.rb

旅程初始化


它工作正常-您对此是否有超出问题范围的问题?

标题的意思是“我可以从另一个类中的方法实例化一个类吗?”是的,应该可以。不是吗?会发生什么?你有错误吗?意外结果?@PaulM您可以单击问题下方的编辑链接来编辑问题。我这次编辑了你的标题。至于您的问题,请点击编辑并添加不起作用的内容。你有任何错误和回溯吗?是不是有些东西没有按预期工作(你预期的是什么,会发生什么情况)?你能补充一下哪些东西没有按预期工作吗?预期的行为是什么?实际的行为与预期的行为有何不同?@PaulM:您不能相互要求两个文件。当执行
Oystercard#touch_in
时,Ruby一定已经看到了
旅程的定义。最简单的方法是
类卡
之前要求
包含
旅程
定义的文件。您好!我重新编写了这个问题,以提供更多关于我的问题是什么的信息,谢谢你的帮助@PaulM从上面的IRB片段中,您在上下文之外调用变量“旅程”。此变量的作用域(本地)为
方法中的
touch\u。不能在该方法的上下文之外调用该变量。如果要执行此操作,则需要一个实例变量-
@travely=travely.new
class Journey
    # ...
    def initialize
        puts "Journey initialized"
      # ...
    end
    # ...
  end


require_relative 'journey'

class Oystercard

    def initialize
    end
    # ...
    def touch_in(station)
      journey = Journey.new
      # ...
    end
  end

  Oystercard.new.touch_in("station")