Создание метода с заданной строкой (fname lname) возвращает два - PullRequest
1 голос
/ 30 апреля 2011

Учитывая строку типа "james bond" или "roger r burns", я хотел бы создать метод, который принимает ввод и возвращает имя и фамилию:

Для указанных выше случаев:

Input: James Bond
Returns:
  fname: james
  lname: bond

Input: Roger r Burns
Returns
  fname: Roger r
  lname: Burns

Input: Roger
Returns
  fname: Roger
  lname:

Input:
Returns
  fname:
  lname:
  • Там, где пустой ввод не приводит к ошибке, но возвращает пустые значения.

Как создать метод, который принимает один вход и возвращает две переменные?

Спасибо

Ответы [ 7 ]

3 голосов
/ 30 апреля 2011

Вы можете попробовать что-то вроде этого:

last, first = str.reverse.split(' ', 2).collect{|s| s.reverse}

См. Также: Ruby: разбить строку на символ, считая с правой стороны
Рабочий пример: http://ideone.com/CA9aZ

1 голос
/ 30 апреля 2011

Как насчет этого:

def explode_name(str)
  !str.nil? && str.respond_to?(:split) ? ((2 - (a = str.split(' ', 2)).length).times { a << nil };a) : [nil,nil]
end

explode_name "Mr James Bond" #=> ["Mr", "James Bond"] 
explode_name "Mr Bond"       #=> ["Mr", "Bond"] 
explode_name "Mr"            #=> ["Mr", nil] 
explode_name ""              #=> [nil, nil] 
explode_name nil             #=> [nil, nil] 
explode_name 6               #=> [nil, nil] 

Сравнение ради программирования

1 голос
/ 30 апреля 2011
def sname(name)
  name.match(/^(\w+)(?:.*\b(\w+))?$/)[1..2] rescue raise ArgumentError
end

sname "James Bond" # => ["James", "Bond"]
sname "James J. Bond" # => ["James", "Bond"]
sname "James" # => ["James", nil]
sname "" # => raises ArgumentError
1 голос
/ 30 апреля 2011

Имейте в виду, что этот метод не выполняет особый случай или проверку ошибок и делает огромные предположения о том, что является входным сигналом.

def name_split(string)
  split_string = string.split(' ')
  if split_string.count > 1      
    return split_string[0..split_string.count-2].join(" "), split_string.last
  else
    return split_string.first, nil # nil if there's no last name
  end
rescue NoMethodError
  return nil, nil
end

fname, lname = name_split("Roger Burns")   # => "Roger", "Burns"
fname, lname = name_split("Roger r Burns") # => "Roger r", "Burns"
fname, lname = name_split("Roger")         # => "Roger", nil
fname, lname = name_split(nil)             # => nil, nil
fname, lname = name_split(3)               # => nil, nil
0 голосов
/ 30 апреля 2011

Попробуйте это

def split_names(name)
  parts = name.blank? ? ["", ""] : name.split(" ")
  parts << "" if parts.size == 1
  [parts[0..-2].join(" "), parts.last]
end
0 голосов
/ 30 апреля 2011

Как насчет этого?

def split_name(full_name)
  name = full_name || ''
  split = name.split(' ')
  split.push(nil) if split.length < 2
  return split[0, split.length - 1].join(' '), split.last  
end

names = ['James Bond', 'Roger r Burns', 'Roger', '']
names.each do |name|
  puts "Input: #{name}"
  output = split_name(name)
  puts "First name: #{output.first}"
  puts "Last name: #{output.last}"
  puts "****"
end
0 голосов
/ 30 апреля 2011

Вы можете добавить другую переменную для второго имени.Если существует, тогда присвойте средний инициал части переменной имени.Если он не существует, переместите среднюю переменную (которая на самом деле является фамилией) в переменную фамилии.

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