我正在学习Ruby中的元编程,我只是尝试通过method_missing和define_method定义缺失的方法.我有一些意想不到的行为,我想知道是否有人可以解释这一点.这是我的班级:
class X
def method_missing(m, *args, &block)
puts "method #{m} not found. Defining it."
self.class.send :define_method, m do
puts "hi from method #{m}"
end
puts "defined method #{m}"
end
end
Run Code Online (Sandbox Code Playgroud)
现在,这段代码:
x = X.new
x.some_method
puts
x.some_method
puts
puts x
Run Code Online (Sandbox Code Playgroud)
产生输出:
method some_method not found. Defining it.
defined method some_method
hi from method some_method
method to_ary not found. Defining it.
defined method to_ary
#<X:0x007fcbc38e5030>
Run Code Online (Sandbox Code Playgroud)
我没有得到的是最后一部分:为什么Ruby在调用puts时调用to_ary?为什么Ruby会尝试将我的对象转换为数组只是为了打印它?
我用Google搜索并发现了以下相关链接:
这些也讨论了method_missing和to_ary陷阱,但没有具体说明为什么puts会调用to_ary.
我还应该提一下,当我定义一个to_s时,行为不会改变,例如
def to_s
"I'm an instance of X"
end
Run Code Online (Sandbox Code Playgroud)
然后输出"puts x": …
我有CSV文件,以制表符分隔,字段没有用引号括起来,其中字段数据可以包含单引号,双引号,管道和反斜杠等字符.
示例数据可能如下所示:
1 2 "ba$aR\eR\ 18
Run Code Online (Sandbox Code Playgroud)
我想使用COPY语句将此数据导入Postgres.
当我尝试使用导入它时
COPY <tablename> FROM <filename> NULL AS '';
Run Code Online (Sandbox Code Playgroud)
我得到一个错误,psql:-:1: ERROR: missing data for column因为Postgres将反斜杠+选项卡视为"转义选项卡"而不是反斜杠后跟字段分隔符.
所以我切换到使用COPY运算符的"CSV格式",如下所示:
COPY <tablename> FROM <filename> WITH CSV DELIMITER E'\t' NULL AS '';
Run Code Online (Sandbox Code Playgroud)
现在出现了一个新错误 psql:-:1: ERROR: value too long for type character varying(254)
显然是因为它将字段3开头的双引号解释为字段包装字符.
如何指定我的数据根本没有引用?