小编Tom*_*Leu的帖子

Ruby:为什么要调用to_ary?

我正在学习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": …

ruby metaprogramming method-missing

13
推荐指数
1
解决办法
2386
查看次数

是否可以使用CSV格式关闭Postgres COPY命令中的报价处理?

我有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开头的双引号解释为字段包装字符.

如何指定我的数据根本没有引用?

csv postgresql import

13
推荐指数
2
解决办法
9005
查看次数

标签 统计

csv ×1

import ×1

metaprogramming ×1

method-missing ×1

postgresql ×1

ruby ×1