Иван Сташко wrote:
I would like to create a new general delimiter.
---------- Background
Suppose you have created a specific data type which is a combination of
various other native data types, such as strings and numbers.
Suppose that these are needed throughout your code, so you would like to
quickly express them.
I have found one way to do this,
class WhatEver
.
.
.
end
def we(o)
WhatEver.new(o)
end
so that I can type
a = we " This 73 brqx "
in my code as a shorthand for
a = WhatEver.new "This 73 brqx"
--------- Question
I think code would be more readable if I could type,
a = %e "This 73 brqx"
-> I know there is metaprogramming in Ruby, and Ruby is quite flexible
-> The question is… Is this possible? Where is %q, for example,
defined? It does not appear to be a method of String or Object or
Kernel
-> OK, so let’s say it’s something in C. Where would I modify the C to
get this if I would want to?
%q is part of Ruby’s syntax and not a method. You can’t modify how Ruby
code is parsed via metaprogramming, the only way possible is to modify
Ruby’s C sources before you compile Ruby.
What is possible is to “absuse” the special method (you know, it's usually for executing system commands). Although
cmdlooks like a literal, it's actually the method Kernel#
and as such it can be
overriden:
irb(main):001:0> def (str) irb(main):002:1> puts str irb(main):003:1> end => nil irb(main):004:0>
abc`
abc
=> nil
irb(main):005:0>
Note that it’s possible to do limit the redefined ` to a namespace:
irb(main):001:0> class Foo
irb(main):002:1> def (str) irb(main):003:2> puts "Got #{str}." irb(main):004:2> end irb(main):005:1> def bar irb(main):006:2>
echo helloirb(main):007:2> end irb(main):008:1> end => nil irb(main):009:0>
echo hello=> "hello\n" irb(main):010:0> Foo.new.bar Got echo hello. => nil irb(main):011:0> module Bar irb(main):012:1> class << self irb(main):013:2> def
(str)
irb(main):014:3> puts “Got #{str}.”
irb(main):015:3> end
irb(main):016:2> end
irb(main):017:1> echo hello
irb(main):018:1> end
Got echo hello.
=> nil
irb(main):019:0> echo hello
=> “hello\n”
irb(main):020:0>
I’ve never seen this anywhere, so I suppose it’s considered bad style.
Marvin