Ruby - вызывающий конструктор без аргументов и удаление символов новой строки - PullRequest
0 голосов
/ 18 марта 2012

Я написал пример программы, и я не понимаю следующее:

  1. Почему конструктор без аргументов не вызывается в Ruby?
  2. Как получить доступ к переменной класса вне определения класса?
  3. Почему он всегда добавляет символы новой строки в конце строки? Как мы раздеваем это?

Код:

class Employee
    attr_reader :empid
    attr_writer :empid
    attr_writer :name
    def name
        return @name.upcase
    end
    attr_accessor :salary
    @@employeeCount = 0
    def initiaze()
        @@employeeCount += 1
        puts ("Initialize called!")
    end
    def getCount
        return @@employeeCount
    end
end

anEmp = Employee.new
print ("Enter new employee name: ")
anEmp.name = gets()
print ("Enter #{anEmp.name}'s employee ID: ")
anEmp.empid = gets()
print ("Enter salary for #{anEmp.name}: ")
anEmp.salary = gets()
theEmpName = anEmp.name.split.join("\n")
theEmpID = anEmp.empid.split.join("\n")
theEmpSalary = anEmp.salary.split.join("\n")
anEmp = Employee.new()
anEmp = Employee.new()
theCount = anEmp.getCount
puts ("New employee #{theEmpName} with employee ID #{theEmpID} has been enrolled, welcome to hell! You have been paid as low as $ #{theEmpSalary}")
puts ("Total number of employees created = #{theCount}")

Выход:

Enter new employee name: Lionel Messi
Enter LIONEL MESSI
's employee ID: 10
Enter salary for LIONEL MESSI
: 10000000
New employee LIONEL
MESSI with employee ID 10 has been enrolled, welcome to hell! You have been paid as low as $ 10000000
Total number of employees created = 0

Ответы [ 3 ]

1 голос
/ 18 марта 2012

Для вопроса 1: Почему конструктор без аргументов не вызывается в Ruby?

Вы написали def initiaze().Правильно будет def initialize():

def initialize()
    @@employeeCount += 1
    puts ("Initialize called!")
end
1 голос
/ 18 марта 2012

Новые строки из пользовательского ввода. Когда пользователь что-то вводит и завершает ввод новой строкой (клавишей ввода), новая строка рассматривается как часть ввода. Вы можете удалить его с помощью метода String#strip():

empName = empName.strip

или используйте метод на месте:

empName.strip!

Чтобы получить значение переменной класса, вам нужен статический геттер (обратите внимание на self.):

def self.getCount
    return @@employeeCount
end

В качестве альтернативы вы можете использовать метод class_variable_get .

0 голосов
/ 19 марта 2012
  1. , как вы, похоже, заметили, что ошиблись initialize при определении метода
  2. , вы не можете ссылаться на переменную класса непосредственно вне класса, но вы можете сделать для него доступ к классу или экземпляру.или используйте Module # class_variable_get : Employee.class_variable_get(:@@employeeCount)
  3. gets возвращает всю введенную пользователем строку, включая завершающий символ новой строки.Рекомендуется другой ответ String # strip , но при этом удаляются все конечные и начальные пробелы.Если вы просто хотите удалить символ новой строки, используйте String # chomp , empName = empName.chomp! Будьте осторожны, если у вас возникнет искушение применить chomp напрямую к get, поскольку get вернет nil в конце файла, и вы повыситеNoMethodError посылка: chomp to nil

Кстати, ваши camelCasedNames не подходят для рубинового стиля.Все константы должны быть UPPER_CASE, кроме имен классов и модулей, которые должны быть в CamelCase с начальным колпачком, все остальные имена должны быть lower_case_with_underscores_to_separate_words.Кроме того, в ruby ​​обычно пропускаются пустые скобки при вызовах и определениях методов без аргументов.

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