Ruby: Ошибка: неверное количество аргументов (дано 1, ожидается 0), когда я даю правильное количество аргументов - PullRequest
0 голосов
/ 20 ноября 2018

Вот файл класса:

class HealthProfile
    attr_reader :firstName, :lastName, :gender, :birthYear, :currentYear, :height, :weight
    attr_writer :firstName, :lastName, :gender, :birthYear, :currentYear, :height, :weight

def initialize(firstName, lastName, gender, birthYear, currentYear, height, weight)
    @firstName = firstName
    @lastName = lastName
    @gender = gender
    @birthYear = birthYear
    @currentYear = currentYear
    @height = height
    @weight = weight
end


def userAge(currentYear, birthYear)
    age = currentYear - birthYear
    return age
end


def maxHeartRate(age) #The maximum heart rate is computed as 220 minus age in years
    maxhr = 220 - age
    return maxhr
end

def targetHeartRateRange(maxhr) #The target-heart-rate is a range that is 50-89% of the maximum heart rate
    lowtarget = 0.50 * maxhr
    hightarget = 0.89 * maxhr
    return lowtarget, hightarget
end


def BMI(weight, height) #(weight:lbs * 703) / (height:inches * height:inches)
    bmi = (weight * 703) / (height * height)
    return bmi
end

def displayHealthProfile(firstName, lastName, gender, age, height, weight, maxhr, lowtarget, hightarget, bmi)
    puts ("HEALTH PROFILE FOR: #{firstName lastName}")
    puts ("***********************************")
    puts
    puts ("Gender: #{gender}")
    puts ("Age: #{age}")
    puts ("Height (in inches): #{height}")
    puts ("Weight (in pounds): #{weight}")
    puts ("Maximum heart rate: #{maxhr}")
    puts
    puts
    puts ("Target heart rate range")
    puts ("*************************")
    puts
    puts ("Minimum: #{lowtarget}")
    puts ("Maximum: #{hightarget}")
    puts ("BMI: #{bmi}")
    puts
    puts
    puts ("BMI VALUES")
    puts ("************")
    puts
    puts ("Underweight: less than 18.5")
    puts ("Normal: between 18.5 and 24.9")
    puts ("Overweight: between 25 and 29.9")
    puts ("Obese: 30 or greater")
end
end

Вот основной код файла:

require_relative 'lab11class.rb'
require 'date'

currentYear = Date.today.year
currentYear = currentYear.to_i()

print ("Enter your First Name: ")
firstName = gets()
print ("Enter your Last Name: ")
lastName = gets()
print ("Enter your gender (Male/Female): ")
gender = gets()
print ("Enter your year of birth: ")
birthYear = gets().to_i()
print ("Enter your height in inches: ")
height = gets().to_i()
print ("Enter your weight in pounds: ")
weight = gets().to_i()

hp = HealthProfile.new(firstName, lastName, gender, birthYear, currentYear,     height, weight)
age = hp.userAge(currentYear, birthYear)
maxhr = hp.maxHeartRate(age)
lowtarget, hightarget = hp.targetHeartRateRange(maxhr)
bmi = hp.BMI(weight, height)
hp.displayHealthProfile(firstName, lastName, gender, age, height, weight, maxhr, lowtarget, hightarget, bmi)

Вот полная ошибка

lab11class.rb:40:in `displayHealthProfile': wrong number of arguments (given 1, expected 0) (ArgumentError)

Проблема, по-видимому, связана с методом displayHealthProfile. Следует ожидать 10 аргументов, но когда я ввожу все 10 в основной файл, это выдает ошибку. Однако, если я удаляю один или несколько аргументов из вызова в главном файле, я получаю сообщение об ошибке, за исключением того, что оно говорит (учитывая 9, ожидаемое 10) и так далее, если я должен был удалить больше. Я что-то пропустил? Любая помощь приветствуется.

UPDATE Я исправил это, и программа работает должным образом. Проблема не была с методом вообще, displayHealthProfile был определен правильно. Проблема была с переменными firstName и lastName, которые были первыми, использованными в методе. Эти две переменные были проанализированы с символами новой строки, которые не соответствовали вызову метода. Итак, вот изменения, которые это исправили.

Оригинал

puts ("HEALTH PROFILE FOR: #{firstName lastName}")

Изменено на:

puts ("HEALTH PROFILE FOR: #{firstName.chomp} #{lastName.chomp}")

Спасибо за ваши ответы!

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

В строке 2 вы определяете firstName как метод с нулевыми аргументами:

attr_reader :firstName

(Это метод чтения: метод, который не принимает аргументов.)

Здесь вы звоните firstName с одним аргументом:

puts ("HEALTH PROFILE FOR: #{firstName lastName}")

Ruby позволяет опустить скобки вокруг списка аргументов, что означает, что

firstName lastName

(как в подстановке строк) совпадает с

self.firstName(lastName)

Что вы, вероятно, имеете в виду:

puts ("HEALTH PROFILE FOR: #{firstName} #{lastName}")
#                                     ↑ ↑↑

Обе переменные были проанализированы с символами новой строки, которые плохо сочетались с вызовом метода.

Это не имеет ничего общего с символами новой строки в строках. Содержимое строки не может вызвать эту ошибку. Ошибка была вызвана тем, что вы вызвали firstName с одним аргументом, но определили его с нулем.

0 голосов
/ 20 ноября 2018

In health_profile.rb

class HealthProfile
  def initialize(firstName, lastName, gender, birthYear, currentYear, height, weight)
    @firstName = firstName
    @lastName = lastName
    @gender = gender
    @birthYear = birthYear
    @currentYear = currentYear
    @height = height
    @weight = weight
  end

  def userAge
    @currentYear - @birthYear
  end

  def maxHeartRate #The maximum heart rate is computed as 220 minus age in years
    220 - userAge
  end

  def targetHeartRateRange #The target-heart-rate is a range that is 50-89% of the maximum heart rate
    maxhr = maxHeartRate
    lowtarget = 0.50 * maxhr
    hightarget = 0.89 * maxhr
    [lowtarget, hightarget]
  end

  def bmi #(weight:lbs * 703) / (height:inches * height:inches)
    (@weight * 703) / (@height * @height)
  end

  def displayHealthProfile
    lowtarget, hightarget = targetHeartRateRange

    puts "HEALTH PROFILE FOR: #{@firstName.chomp} #{@lastName}"
    puts "***********************************"
    puts
    puts "Gender: #{@gender}"
    puts "Age: #{userAge}"
    puts "Height (in inches): #{@height}"
    puts "Weight (in pounds): #{@weight}"
    puts "Maximum heart rate: #{maxHeartRate}"
    puts
    puts
    puts "Target heart rate range"
    puts "*************************"
    puts
    puts "Minimum: #{lowtarget}"
    puts "Maximum: #{hightarget}"
    puts "BMI: #{bmi}"
    puts
    puts
    puts "BMI VALUES"
    puts "************"
    puts
    puts "Underweight: less than 18.5"
    puts "Normal: between 18.5 and 24.9"
    puts "Overweight: between 25 and 29.9"
    puts "Obese: 30 or greater"
  end
end

В main.rb

require_relative 'health_profile.rb'
require 'date'

currentYear = Date.today.year
currentYear = currentYear.to_i()

print ("Enter your First Name: ")
firstName = gets()
print ("Enter your Last Name: ")
lastName = gets()
print ("Enter your gender (Male/Female): ")
gender = gets()
print ("Enter your year of birth: ")
birthYear = gets().to_i()
print ("Enter your height in inches: ")
height = gets().to_i()
print ("Enter your weight in pounds: ")
weight = gets().to_i()

hp = HealthProfile.new(firstName, lastName, gender, birthYear, currentYear, height, weight)
hp.displayHealthProfile

Тогда

ruby main.rb
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...