From: "merborne (kyo endo)" Date: 2012-07-27T23:38:28+09:00 Subject: [ruby-core:46816] [ruby-trunk - Feature #6801] String#~ for a here document Issue #6801 has been updated by merborne (kyo endo). Eregon (Benoit Daloze) wrote: > merborne (kyo endo) wrote: > > > > > > Maybe something like <<+EOS, which would remove the common indentation? > > > In your example, it seems fine to have to manually undent the text, > > > but I think the most common use-case is declaring an heredoc in an indented code. > > > > Sorry, I don't understand your point. In the example, the target string is shifted to the left for 4 whitespaces with String#~. > > I meant your example is probably not the most typical, with its "centered" nature. And I'm fine with having to manually remove the spaces or flush it to the left for such a usage. I would be less fine, with, for example: > > module MyApp > module Commands > class Show > def error_message(err) > <<+EOS > Error: #{err.class} > #{err.message} > EOS > end > end > end > end > (found in [ruby-core:39930]) > > Sorry, I did not remember http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-core/39959. > You might be right String#~ (or String#undent) to have more chances to ever end. ok. thank you. ---------------------------------------- Feature #6801: String#~ for a here document https://bugs.ruby-lang.org/issues/6801#change-28490 Author: merborne (kyo endo) Status: Open Priority: Normal Assignee: Category: Target version: =begin Let me propose a new method (({String#~})) for a here document. ������������������������(({String#~}))��������������������� class String def ~ margin = scan(/^ +/).map(&:size).min gsub(/^ {#{margin}}/, '') end end This is for removing leading margins of a here document. ������������������������������������������������������������������������������������������������������ class ATool def self.help lines = ~<<-EOS Instruction of `#{self}` `#{self}` is one of a great tool in the world. This helps you a lot on your daily work. Your life will be changed with `#{self}`!! Everyone knows about `#{self}`. So, You can ask them to learn `#{self}` Just Use `#{self}` from Today! EOS lines end end puts ATool.help # >> Instruction of `ATool` # >> # >> `ATool` is one of a great tool in the world. # >> This helps you a lot on your daily work. # >> Your life will be changed with `ATool`!! # >> Everyone knows about `ATool`. # >> So, You can ask them to learn `ATool` # >> # >> Just Use `ATool` # >> # >> from Today! you can put a tilde sign just before the "<<" characters to call String#~, just like putting a minus sign after "<<" to indent the terminator. This is achieved with uniqueness of tilde sign method, which takes the receiver object on the right-hand side. If you define String#unindent for this purpose, you put `.unindent` after EOS. I think its less elegant than a tilde. "<<"������������������������������������������������String#~������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������String#unindent���������������������������EOS���������`.unindent`������������������������������������������������������������������������������������������������ I understand that this is not general method for string but just for here document. However, I think using a tilde as a method is very restricted because it can't take parameters and is difficult to read the meanings or behavior from the sign. From this, there are few tilde methods within built-in classes of ruby inspite of its uniqness(only for Fixnum, Bignum and Regexp). so, I think using tilde for the above purpose is the one of the few good chances. Thank you for your consideration. ���������������������String���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Ruby���������������������������������������������������������Fixnum, Bignum���������Regexp��������������� ������������������������������������������������������������������������������������������������������������ ��������������������������������������������������������������� This is based on the following my Japanese blog post. (()) =end -- http://bugs.ruby-lang.org/