Я пишу DSL. Я не хочу, чтобы пользователям приходилось приводить аргументы для передачи строк, поэтому я переписываю method_missing
, чтобы преобразовать неизвестный метод в строку. В следующем примере create
является методом DSL, и я хотел, чтобы пользователь вводил arg1
и arg2
без кавычек.Почему `gsub` вызывает` to_hash`?
def method_missing(m, *arg)
m.to_s
end
def create(*args)
arg1.gsub(#do something here)
end
create arg1 arg2
Однако это вызывает и ошибок, когда я использую gsub
на «строка»:
'gsub': can't convert String to Hash (String#to_hash gives String) (TypeError)
Я думаю method_missing
перезапись испортили его, так как он выглядит как gsub
звонит String#to_hash
, который а не метод в String
, поэтому он направляется на method_missing
.
Мне интересно, почему gsub
звонит String#to_hash
, или есть ли другой способ позволить пользователям DSL не печатать кавычки без перезаписи method_missing
.
Какова связь между 'arg1',' arg2' и 'args' в' create'? – sawa
arg1,2 - это просто аргументы, переданные методу create, возможно, я должен добавить что-то вроде arg1 = arg.first перед gsub-линией, поэтому его менее запутанное значение – yuzhoul