Ruby中如何将绑定函数用作Proc?CSV处理场景疑问
问题解答
首先,你想要的.map String.split.bind(',')写法不可行,原因很简单:split是String的实例方法,不是类方法——只有字符串实例才能调用split,String.split本身就是不存在的方法,自然没法用bind绑定参数。
替代的简洁写法
如果想简化map {|it|it.split(",")},可以用lambda封装这个逻辑,写法如下:
File.read("info.csv") .split[1..] .map(&->(str) { str.split(',') })
不过说实话,原写法{|it|it.split(",")}已经足够简洁易读,没必要强行追求更短的写法,可读性在Ruby里是很重要的原则。
关于"传递消息为proc"的补充
你搜索的ruby pass message as proc对应的Ruby概念,其实是把"给对象发送带参数的消息"转换成可复用的proc/lambda。对于实例方法带参数的情况,&:method这种简写(比如.map(&:strip))只能处理无参调用,要传参数的话就必须用lambda或者手动写块,就像你原来的写法那样。
更专业的CSV处理方式
作为Ruby新手,额外提一句:Ruby标准库自带csv模块,专门用来处理CSV文件,比手动split靠谱得多(比如能处理带引号的逗号、换行等特殊情况),用法示例:
require 'csv' # 跳过表头(对应你代码里的[1..]) CSV.foreach("info.csv", headers: true) do |row| # row是CSV::Row对象,可以像哈希一样访问列 puts row["列名"] end # 或者直接读取成数组(跳过表头) data = CSV.read("info.csv", headers: true).map(&:to_h)
内容的提问来源于stack exchange,提问作者Manse
相关产品推荐
相关产品推荐

