Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 这个C到Ruby的最干净的端口是什么?_Ruby On Rails_Ruby - Fatal编程技术网

Ruby on rails 这个C到Ruby的最干净的端口是什么?

Ruby on rails 这个C到Ruby的最干净的端口是什么?,ruby-on-rails,ruby,Ruby On Rails,Ruby,我正在将逗号分隔的字符串解析为数组。在C中,我有: var someArray = someString.Split( new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); foreach (var something in someArray) { SomeList.Add(something.Trim().ToLower()); } 以下是我到目前为止在Ruby中使用Rails的内容。blank s

我正在将逗号分隔的字符串解析为数组。在C中,我有:

var someArray = someString.Split(
    new char[] { ',' },
    StringSplitOptions.RemoveEmptyEntries);

foreach (var something in someArray)
{
    SomeList.Add(something.Trim().ToLower());
}
以下是我到目前为止在Ruby中使用Rails的内容。blank

some_array = some_string.split(',').each { |something| something.strip.downcase }
some_array.delete_if { |something| something.blank? }
有没有更干净的方法

some_string.split(',').map(&:strip).map(&:downcase).reject(&:empty?)
这将创建三个中间数组,并遍历所有三个中间数组,但我通常不会担心这一点,除非您能够通过性能分析证明这是一个严重的瓶颈

否则你就得做类似的事情

some_string.split(',').inject([]) {|ary, str|
  ary.tap { unless (str = str.strip.downcase).empty? then ary << str end }
}
旁注:我可能写的C代码更像这样:

var someList = new List<string>(
    from s in someString.Split(
        new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
    select s.Trim().ToLower());
这将创建三个中间数组,并遍历所有三个中间数组,但我通常不会担心这一点,除非您能够通过性能分析证明这是一个严重的瓶颈

否则你就得做类似的事情

some_string.split(',').inject([]) {|ary, str|
  ary.tap { unless (str = str.strip.downcase).empty? then ary << str end }
}
旁注:我可能写的C代码更像这样:

var someList = new List<string>(
    from s in someString.Split(
        new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
    select s.Trim().ToLower());

a您编写的代码没有达到预期效果。您可以调用.each并对字符串调用非变异方法。因此,您的some_数组与some_string.split','相同

b我个人会这样做:

arr = str.split(',').map{ |s| s.blank? ? nil : s.strip.downcase }.compact
这将创建一个可能包含nil项的数组,然后使用compact将其删除。但是,如果绝对速度至关重要,这将更快:

arr = []
str.split(',').each do |s|
  arr << s.strip.downcase unless s.blank?
end

编辑:修改代码,将.strip.downcase延迟到空白测试之后。

a您编写的代码没有达到预期效果。您可以调用.each并对字符串调用非变异方法。因此,您的some_数组与some_string.split','相同

b我个人会这样做:

arr = str.split(',').map{ |s| s.blank? ? nil : s.strip.downcase }.compact
这将创建一个可能包含nil项的数组,然后使用compact将其删除。但是,如果绝对速度至关重要,这将更快:

arr = []
str.split(',').each do |s|
  arr << s.strip.downcase unless s.blank?
end

编辑:修改代码,将.strip.downcase延迟到空白测试之后。

谢谢您的回答。同意不进行预优化,只是尝试移植它。如果你想在同一个数组中重复两次:some|string.split','.reject&:empty?.map{e | e.strip.downcase}如果有什么问题,它很可能是我的代码,但是输入'first,second,thirD',会在数组中产生4项而不是3项。末尾有一项C版本没有返回。有人能验证吗?@blu:很难弄清楚您的C代码的确切边缘情况,因为您既没有指定它们,也没有提供测试用例,您发布的代码也没有实际工作。但是,在修复它之后,我得到了一个包含四个元素的列表,包括一个空字符串作为最后一个元素,就像我的代码一样。@Ryan Bigg:我非常喜欢无点风格。我不喜欢为不值得命名的变量发明名称。命名很难,给某个东西起个名字会把它提升到一个不一定值得重视的程度。谢谢你的回答。同意不进行预优化,只是尝试移植它。如果你想在同一个数组中重复两次:some|string.split','.reject&:empty?.map{e | e.strip.downcase}如果有什么问题,它很可能是我的代码,但是输入'first,second,thirD',会在数组中产生4项而不是3项。末尾有一项C版本没有返回。有人能验证吗?@blu:很难弄清楚您的C代码的确切边缘情况,因为您既没有指定它们,也没有提供测试用例,您发布的代码也没有实际工作。但是,在修复它之后,我得到了一个包含四个元素的列表,包括一个空字符串作为最后一个元素,就像我的代码一样。@Ryan Bigg:我非常喜欢无点风格。我不喜欢为不值得命名的变量发明名称。命名很难,给某个东西起一个名字会提升它的重要性,它不一定值得。谢谢你解释为什么非变异是错误的。你的答案和我看到的很接近;在那里塞进一个零,然后压缩它。你的两个答案都有效。最后,我选择了第二个,每个区块都排在一行,并没有重新分配到s,一切看起来都很好。谢谢,布兰克?应该捕获空白字符串,那么我们可以将条带移动到条件中吗?感谢您解释为什么非变异是错误的。你的答案和我看到的很接近;在那里塞进一个零,然后压缩它。你的两个答案都有效。最后,我选择了第二个,每个区块都排在一行,并没有重新分配到s,一切看起来都很好。谢谢,布兰克?应该捕获空白字符串,这样我们可以将条带移动到条件中吗?