Ruby 我可以从另一个类中的方法实例化一个类吗?(红宝石)
我重做了这个问题,并包含了两个文件的完整代码。在touch_In方法中,我试图在名为“touche”的变量中实例化一个旅程类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
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")