Передача параметров метода Ruby HERE-DOC

Я пытаюсь использовать собственный метод с here-doc и хочу передать параметр (нет бизнес-кейса, я просто пытаюсь изучить рубин). Есть ли способ передать параметр в этом случае? Это то, что у меня есть до сих пор.

Простой метод, просто отлично работает.

def meth1
  self.upcase
end

str1 = <<MY.meth1
  i am a small case string
MY

# "I AM A SMALL CASE STRING\n"

Теперь я подумал, давайте отбросим некоторые параметры и попробуем разные варианты, и irb смотрит на меня пустым взглядом.

#variation 1

def meth2( <<EOF1, <<EOF2 )
  EOF1.upcase + "..." + EOF2.downcase
end

str2 = <<MY.meth2
 some string
EOF1
 ANOTHER STRING
EOF2
MY

person Bala    schedule 30.05.2013    source источник
comment
Что с << ?   -  person Kevin Bowersox    schedule 30.05.2013
comment
Я не думаю, что вы можете передать здесь документ в качестве аргумента. Нет смысла так делать.   -  person sawa    schedule 30.05.2013
comment
@kevin: я пробовал EOF1, EOF2 без ‹‹. Как я уже сказал, это была одна из разных вещей, которые я пробовал.   -  person Bala    schedule 30.05.2013


Ответы (3)


Я предполагаю, что это то, что вы пытаетесь сделать:

def meth2(str1, str2)
  str1.upcase + "..." + str2.downcase
end

str2 = meth2(<<EOF1, <<EOF2)
 some string
EOF1
 ANOTHER STRING
EOF2

str2 # => " SOME STRING\n... another string\n"

Если вы не собираетесь делать отступ, см. здесь. ← Видите здесь мою игру слов?

person sawa    schedule 30.05.2013
comment
это очень близко. Принятый - person Bala; 30.05.2013
comment
Все еще не то, что вы хотите? Как это отличается? - person sawa; 30.05.2013

попробуй что-нибудь в духе

something = "bananas"

str = <<EOF
  this has some #{something} in!
EOF
person Ian Kenney    schedule 30.05.2013

Попробуйте что-то вроде этого:

def meth2( item1, item2 )
  item1.upcase + "..." + item2.downcase
end

str2 = meth2 <<EOF1, <<EOF2
 some string
EOF1
 ANOTHER STRING
EOF2

Проблема, с которой вы столкнулись, связана с неполным пониманием того, как работают строковые литералы в стиле heredoc. Часть <<DELIMITER просто говорит синтаксическому анализатору получить строковые данные из строк, следующих за ней. Если в строке более одного <<DELIMITER, то они складываются и считываются последовательно. Итак, в этом случае приведенный выше код точно эквивалентен:

def meth2( item1, item2 )
  item1.upcase + "..." + item2.downcase
end

str2 = meth2 " some string\n", " ANOTHER STRING\n"

Самое главное, нет способа встроить heredoc в функцию, как вы пытались сделать там... Их можно использовать только в тех же местах и ​​способом, что и другие строковые литералы, такие как «двойные кавычки» или «одинарные кавычки». ' можно использовать литералы.

person marcus erronius    schedule 30.05.2013