Issue #9098 has been updated by Andrew M.
I'm confused. Why are tabs being treated as equivalent to spaces at all? E.g. If I write:
```ruby
def hello
puts <<~README.inspect
<tab>Hello
<space><space><space><space><space><space><space><space>World!
README
end
end
```
Are you saying that should be accepted by the compiler? Why? Why should that be any less invalid than:
```ruby
def hello
puts <<~README.inspect
<tab>Hello
<space><space><space><space>World!
README
end
end
```
or
```ruby
def hello
puts <<~README.inspect
<space><space><space><space>Hello
<space><space>World!
README
end
end
```
Shouldn't we just throw an error in all of those cases? Is there ever a legitimate reason why you'd want to allow inconsistent indentation in one of these blocks? What happens when someone has their editor set to display tabs as 4 spaces, and writes:
```ruby
def hello
puts <<~README.inspect
<space><space><space><space>Hello
<tab>World!
README
end
end
```
Why should that result in:
```ruby
hello #=> " Hello\n\n\tWorld!"
```
I certainly wouldn't expect that result intuitively. In such a case, wouldn't a well-written error message explaining that I'm mixing tabs and spaces be much more helpful for me as a developer?
(Note: I also cross-posted to the PR. I'm not really sure where the canonical place is for discussion on this feature.)
----------------------------------------
Feature #9098: Indent heredoc against the left margin by default when "indented closing identifier" is turned on.
https://bugs.ruby-lang.org/issues/9098#change-55123
* Author: Prem Sichanugrist
* Status: Assigned
* Priority: Normal
* Assignee: Yukihiro Matsumoto
----------------------------------------
tl;dr: I would like to port +String#strip_heredoc+ (http://api.rubyonrails.org/classes/String.html#method-i-strip_heredoc) from Rails and enable it on `<<-` heredoc.
Hi,
I've been using here document (heredoc) for a while, and I've found out that it's very annoying that the content is always treated as flushed left. Per syntax doc:
Note that the while the closing identifier may be indented, the content is
always treated as if it is flush left. If you indent the content those spaces
will appear in the output.
So, this is the current result if you use heredoc in Ruby:
class FancyHello
def self.hello
puts <<-README.inspect
Hello
World!
README
end
end
FancyHello.hello # => " Hello\n World!\n"
In Rails, the core team has implemented +String#strip_heredoc+, which handles this scenario by remove leading white spaces from the string. However, not many user know that Rails has that method, and instead doing this to get around it:
class FancyHello
def self.hello
puts <<-README.inspect
Hello
World!
README
end
end
FancyHello.hello # => "Hello\n World!\n"
I really think that we could do better on this by removing the leading white spaces, matching +String#strip_heredoc+ method.
So, after the change, I want to be able to do this, and get this result:
class FancyHello
def self.hello
puts <<-README.inspect
Hello
World!
README
end
end
FancyHello.hello # => "Hello\n World!\n"
Note: the behavior on `<<HEREDOC` will stay the same, as I feel like in that case you really want the input to be flushed left.
I'll write up a patch and submit it if you think this is a good idea. Please let me know any question or concern you may have.
Thank you,
Prem
---Files--------------------------------
dedent_heredoc.patch (12.8 KB)
--
https://bugs.ruby-lang.org/