From: justcolin@... Date: 2016-03-09T22:25:15+00:00 Subject: [ruby-core:74254] [Ruby trunk Feature#11997] A method to read a file with interpolations Issue #11997 has been updated by Colin Fulton. As far as implementation, `File.eval` doesn't feel right since you may want any `IO` object���or any object with `#read`���to be `eval`-able. Also giving `File` the ability to do `eval` feels like it violated the single responsibility principle a bit too much. Instead maybe `#eval` or `#instance_eval`/`#instance_exec`/`#class_eval`/etc. should accept instances of `IO` or `IO`-like objects as an argument. Calls would then look something like: ```ruby eval File.new('../pugs.txt') ``` ---------------------------------------- Feature #11997: A method to read a file with interpolations https://bugs.ruby-lang.org/issues/11997#change-57387 * Author: Tsuyoshi Sawada * Status: Feedback * Priority: Normal * Assignee: ---------------------------------------- I request a single method that reads a file while interpreting interpolated Ruby code in it (in the current context). For example, suppose I have a file `foo.txt`. foo.txt ~~~ #{char * 20} Hello, my name is #{name}. #{char * 20} ~~~ I am not sure about what method name the proposed feature should have, and on which class it should be defined, but let's temporarily call it `File.eval`. Then I would like to do: ~~~ruby char = "*" name = "John Doe" File.eval("foo.txt") # => "********************\nHello, my name is John Doe.\n********************\n" ~~~ The use case that I have in mind is to easily create template engines/preprocessors, or do an equivalent of what such software do on the fly within a script. There are tools like erb, SCSS, haml, etc., but those force a particular syntax, and they are full fledged software with their own parsing capability, which means it takes an extra time to parse, and the sortware may have their own bugs. I often feel that I do not want to adopt any of the syntax forced in those limited choice of template/preprocessing software, but do it in a freer way. Using what we have currently, I can do it with: ~~~ruby eval('"' + File.read("foo.txt") + '"') ~~~ but that looks cumbersome, and wish if Ruby had a C-level built-in capability for doing that. I believe that would encourage wide range of Ruby users to more freely create their own templating system. -- https://bugs.ruby-lang.org/ Unsubscribe: