Добавьте «s» в конец каждого слова в массиве, за исключением 2-го элемента в данном массиве, используя только одну строку кода - PullRequest
0 голосов
/ 24 декабря 2018

У меня есть массив строк из одного слова, и я хотел бы добавить 's' в конец каждой строки из одного слова, за исключением 2-й строки (элемента) в массиве.Я легко могу сделать это, используя 9 строк кода, но предпочел бы сделать это с 3 строками кода.

Вот мой рабочий код, использующий 9 строк.

def add_s(array)
    array.each_with_index.collect do |element, index|
        if index == 1
            element
        else element[element.length] = "s"
            element
        end
    end
end

Вот мой неработающий кодпока только пытаюсь использовать 3 строки.

def add_s(array)
    array.each_with_index.map {|element, index| index == 1 ? element : element[element.length] = "s"}
end

Выше вернется ...

array = ["hand", "feet", "knee", "table"]
add_s(array) => ["s", "feet", "s", "s"]

Я пытаюсь получить ...

array = ["hand", "feet", "knee", "table"]
add_s(array) => ["hands", "feet", "knees", "tables"]

Ответы [ 5 ]

0 голосов
/ 25 декабря 2018

Разрыв строки в Ruby не является обязательным, их всегда можно заменить ключевым словом, точкой с запятой, а иногда и вовсе удалить.Поэтому всегда легко написать любую программу на Ruby, какой бы сложной она ни была, в одну строку.

Вот ваш код в одну строку:

def add_s(array) array.each_with_index.collect do |element, index| if index == 1 then element else element[element.length] = "s"; element end end end

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

0 голосов
/ 24 декабря 2018

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

arr = ['apple', 'knee', 'crab', 'jails']
arr.each_with_index.map { |x,i| i == 1  ? x : x + 's' }
=> ["apples", "knee", "crabs", "jailss"]

, но во избежание нежелательных лишних 's' в конце строк,

arr = ['apple', 'knee', 'crab', 'jails']
arr.each_with_index.map { |x,i| i == 1 || x[-1] == 's' ? x : x + 's' }
=> ["apples", "knee", "crabs", "jails"]
0 голосов
/ 24 декабря 2018

Вы должны четко различать методы мутирование приемник (переменная, к которой они вызваны) и методы pure , не имеющие побочных эффектов.Также вам следует позаботиться о том, что возвращает метод, если вы хотите использовать результат метода.

Здесь метод для всех индексов (кроме 1) возвращает "s", потому что это то, что возвращает блок:

foo = "bar"
foo[foo.length] = "s"
#⇒ "s"

Если вы позже проверите свой массив мутированный , вы увидите, что он был успешно изменен на желаемый.

input = %w[hand feet knee table]
def add_s(input)
  input.each_with_index.map do |element, index|
    index == 1 ? element : element[element.length] = "s"
  end
  input # ⇐ HERE :: return the mutated object
end
#⇒ ["hands", "feet", "knees", "tables"]

или дажепроще, не map , просто итерируйте и изменяйте:

input = %w[hand feet knee table]
def add_s(input)
  input.each_with_index do |element, index|
    element[element.length] = "s" unless index == 1
  end
end

Вместо того, чтобы мутировать массив на месте, предпочтительным решением будет вернуть измененную версию.Для этого вы должны вернуть новых значений из блока:

def add_s(input)
  input.each_with_index.map do |element, index|
    index == 1 ? element : element + "s"
  end
end
#⇒ ["hands", "feet", "knees", "tables"]

Если бы мне дали такую ​​задачу, я бы также вел список элементов, которые должны быть пропущены, так какрано или поздно их станет больше:

input = %w[hand feet knee scissors table]
to_skip = [1, 3]
def add_s(input)
  input.each_with_index.map do |element, index|
    next element if to_skip.include?(index)
    element + "s"
  end
end
#⇒ ["hands", "feet", "knees", "scissors", "tables"]
0 голосов
/ 24 декабря 2018

Это легко сделать с помощью 'active_support'

arr = ["hand", "feet", "knee", "table"]

2.0.0-p648 :023 > require 'active_support/inflector'
 => true

arr.map { |a| arr.index(a) == 1 ? a : a.pluralize }
 => ["hands", "feet", "knees", "tables"]
0 голосов
/ 24 декабря 2018
["hand", "feet", "knee", "table"].map.with_index{|v,i| i==1 ? v : v + 's'}
#=> ["hands", "feet", "knees", "tables"]

map.with_index помогает.
В основном map.with_index равно each_with_index.collect.
each с collect (аналогично map) излишне.

Если вы хотите изменить исходный массив, вы можете изменить + на <<, но это не рекомендуется.

...