调用方法时返回值错误

时间:2016-10-24 20:31:51

标签: ruby-on-rails ruby

我需要添加一个tractor_beam实例方法,该方法将项目的字符串描述作为参数(例如,“cow”)。当被调用时,该方法应该禁用盾牌,如果物品不是太重而无法拾取,则将物品与船舶的当前位置一起添加到库存中(请参阅下面的算法),再次启用盾牌,然后返回true。如果项目太重而无法提取,则该方法应跳过库存更新并返回false。

Algorithm:

如果一个项目的字母加起来超过500,就太重了。使用.ord(不是很科学,我知道。)例如, cow 的字母加起来 329 ,所以我们的拖拉机梁可以绑架一头牛,没问题。

我的问题是它返回nil和一个空哈希,我如何分解项目以将每个添加到一起?

代码:

class Spaceship
  attr_accessor :name, :location, :item, :inventory
  attr_reader :max_speed

  def initialize (name, max_speed, location)
    puts "Initializing new Spaceship"
    @name = name
    @max_speed = max_speed
    @location = location
    @item = item
    @inventory = {}
   end

  def disable_shield
    puts "Shield is off!"
   end

  def enable_shield
    puts "Shield is on!"
   end

  def warp_to(location)
     puts "Traveling at #{max_speed} to #{location}!"
     @location = location
   end

  def tractor_beam(item)
    disable_shield

    item = item.split('')

    item.each do |let|
      let.ord
      let + let.next
    end

    return item

    if item > 500
      enable_shield
      @inventory[@location] = item
      return true
     else
      return false
      end
    end
 end

驱动程序代码:

uss_enterprise = Spaceship.new("USS Enterprise","200,000 mph", "China")

hms_anfromeda = Spaceship.new("HMS Andromeda", "108,277 mph", "China")

uss_enterprise.disable_shield
hms_anfromeda.enable_shield

p hms_anfromeda.location

hms_anfromeda.warp_to("Namibia")

p hms_anfromeda.location

hms_anfromeda.tractor_beam("cow")

p hms_anfromeda.item

终端

Initializing new Spaceship
Initializing new Spaceship
Shield is off!
Shield is on!
"China"
Traveling at 108,277 mph to Namibia!
"Namibia"
Shield is off!
nil

2 个答案:

答案 0 :(得分:1)

您的tractor_beam方法中的这一行return item每次都会在到达您的if语句之前运行我认为这会导致问题。

此外,您没有使用在@item方法中创建的实例变量initialize,我认为您可能真的需要这样的内容:

def tractor_beam(item)
  disable_shield

  @item = item.split('')
  weight = 0

  @item.each do |let|
    weight += let.ord   
  end

  if weight < 500
    enable_shield
    @inventory[@location] = @item
    return true
   else
    return false
    end
  end
end

答案 1 :(得分:1)

首先,在return条件之前,您有if语句,因此条件永远不会运行。删除它。 其次,您使用ord获得项目的权重,但您没有将值分配给任何内容:

item.each do |let|
  let.ord
  let + let.next
end

return item

if item > 500

这应该可以解决问题:

item = item.split('')
weight = 0

item.each do |let|
  weight += let.ord # add the ord of this letter to the weight
end

if weight > 500 # weight is now the ord of each letter of item 'cow'
  enable_shield
  @inventory[@location] = item
  return true
else
  return false
end