我怎样才能更好地重构这段代码?
How could I refactor well better this code?
我是 Ruby 的新手,我一直在寻找编写/重构代码的最佳方式。在这里,我想创建一个方法来创建一个包含两个新数组的数组。第一个,仅包含等于 size
参数的单词并按字母顺序排序。第二个,也排序,与所有其他词。我很确定我可以改进这段代码,但我不知道如何改进。感谢您的帮助!
sentence = ["dog", "data", "ask", "my", "win", "two", "beer", "as"]
def size_splitter(array, size)
first_array = []
second_array = []
final_array = []
array.sort.each do |arr|
if arr.size == size
first_array << arr
else
second_array << arr
end
end
final_array.push(first_array, second_array)
end
puts size_splitter(sentence, 3)
#result : [["ask", "dog", "two", "win"], ["as", "beer", "data", "my"]]
您实际上可以使用 Enumerable#partition
作为一个衬垫来完成
Returns two arrays, the first containing the elements of enum for which the block evaluates to true, the second containing the rest.
当它说“returns 两个数组”时,它实际上意味着“return 一个包含两个数组的数组”,这就是您需要的结果(注意,Ruby 不是t 支持函数中的多个 return 值,因此 return 两个数组的唯一方法是将它们包装在另一个数组中)
sentence.sort.partition { |x| x.length == 3 }
# => [["ask", "dog", "two", "win"], ["as", "beer", "data", "my"]]
你最好在单独的文件中定义方法,甚至考虑使用 Module
,但现在让我们把它放在最开头:
def size_splitter(array, size)
...
end
sentence = [...]
接下来要指出的是使用 %w[]
字面值作为单个单词字符串的数组(包含多个单词字符串):
sentence = %w[dog data ask my win two beer as]
接下来使用Array#select
(这是任何数组class对象所具有的方法)根据条件select只需要需要的元素:
size = 3
array.select { |e| e.size == size }
此代码将 return 和仅包含大小等于 3 的原始 array
(惊喜!)元素的数组。
select
的反义词是reject
:
size = 3
array.reject { |e| e.size == size }
此代码将 return 大小为 而不是 等于 3 的元素数组。
但在你的情况下(当你需要两个数组的数组时)max pleaner 的解决方案更好:
size = 3
return [
array.select { |e| e.size == size },
array.reject { |e| e.size == size }
]
等于:
size = 3
return array.sort.partition { |x| x.length == size }
但是我们不需要 return
-s 作为 ruby 方法中的最后一个(也是唯一一个)表达式。
所以我的代码最终版本将如下所示:
def size_splitter(array, size)
array.sort.partition { |x| x.length == size }
end
sentence = %w[dog data ask my win two beer as]
puts size_splitter(sentence, 3)
我是 Ruby 的新手,我一直在寻找编写/重构代码的最佳方式。在这里,我想创建一个方法来创建一个包含两个新数组的数组。第一个,仅包含等于 size
参数的单词并按字母顺序排序。第二个,也排序,与所有其他词。我很确定我可以改进这段代码,但我不知道如何改进。感谢您的帮助!
sentence = ["dog", "data", "ask", "my", "win", "two", "beer", "as"]
def size_splitter(array, size)
first_array = []
second_array = []
final_array = []
array.sort.each do |arr|
if arr.size == size
first_array << arr
else
second_array << arr
end
end
final_array.push(first_array, second_array)
end
puts size_splitter(sentence, 3)
#result : [["ask", "dog", "two", "win"], ["as", "beer", "data", "my"]]
您实际上可以使用 Enumerable#partition
作为一个衬垫来完成Returns two arrays, the first containing the elements of enum for which the block evaluates to true, the second containing the rest.
当它说“returns 两个数组”时,它实际上意味着“return 一个包含两个数组的数组”,这就是您需要的结果(注意,Ruby 不是t 支持函数中的多个 return 值,因此 return 两个数组的唯一方法是将它们包装在另一个数组中)
sentence.sort.partition { |x| x.length == 3 }
# => [["ask", "dog", "two", "win"], ["as", "beer", "data", "my"]]
你最好在单独的文件中定义方法,甚至考虑使用 Module
,但现在让我们把它放在最开头:
def size_splitter(array, size)
...
end
sentence = [...]
接下来要指出的是使用 %w[]
字面值作为单个单词字符串的数组(包含多个单词字符串):
sentence = %w[dog data ask my win two beer as]
接下来使用Array#select
(这是任何数组class对象所具有的方法)根据条件select只需要需要的元素:
size = 3
array.select { |e| e.size == size }
此代码将 return 和仅包含大小等于 3 的原始 array
(惊喜!)元素的数组。
select
的反义词是reject
:
size = 3
array.reject { |e| e.size == size }
此代码将 return 大小为 而不是 等于 3 的元素数组。
但在你的情况下(当你需要两个数组的数组时)max pleaner 的解决方案更好:
size = 3
return [
array.select { |e| e.size == size },
array.reject { |e| e.size == size }
]
等于:
size = 3
return array.sort.partition { |x| x.length == size }
但是我们不需要 return
-s 作为 ruby 方法中的最后一个(也是唯一一个)表达式。
所以我的代码最终版本将如下所示:
def size_splitter(array, size)
array.sort.partition { |x| x.length == size }
end
sentence = %w[dog data ask my win two beer as]
puts size_splitter(sentence, 3)