Generate a unique symbol.
Symbol.generate => :-1
If key is given the new symbol will be prefixed with it.
Symbol.generate(:foo) => :foo-1 TODO: Is the generated symbol format acceptable?
CREDIT: Trans
[ + ]
# File lib/core/facets/symbol/generate.rb, line 15 def self.generate(key=nil) key = key.to_sym if key @symbol_generate_counter ||= {} @symbol_generate_counter[key] ||= 0 num = @symbol_generate_counter[key] += 1 ("#{key}-%X" % num).to_sym end
Just like String#chomp.
:ab.chomp(:b) #=> :a
CREDIT: Trans
[ + ]
# File lib/core/facets/symbol/chomp.rb, line 9 def chomp(seperator) to_s.chomp(seperator.to_s).to_sym end
[ + ]
# File lib/core/facets/symbol/chomp.rb, line 19 def lchomp(seperator) to_s.reverse.chomp(seperator.to_s).reverse.to_sym end
Does a symbol have a "not" sign?
"friend".to_sym.not? #=> false "~friend".to_sym.not? #=> true
CREDIT: Trans
[ + ]
# File lib/core/facets/symbol/not.rb, line 10 def not? self.to_s.slice(0,1) == '~' end
[ + ]
# File lib/core/facets/symbol/plain.rb, line 3 def plain? c = to_s[-1,1] !(c == '=' || c == '?') end
[ + ]
# File lib/core/facets/symbol/plain.rb, line 12 def query? to_s[-1,1] == '?' end
Convert symbol to string, apply string method and convert back to symbol via a fluent interface.
:HELLO.re_s.downcase
[ + ]
# File lib/core/facets/symbol/re_s.rb, line 11 def re_s @re_s ||= Functor.new do |op, *a| to_s.send(op, *a).to_sym end end
[ + ]
# File lib/core/facets/symbol/plain.rb, line 8 def setter? to_s[-1,1] == '=' end
Successor method for symobol. This simply converts the symbol to a string uses String#succ and then converts it back to a symbol.
:a.succ => :b
TODO: Make this work more like a simple character dial?
[ + ]
# File lib/core/facets/symbol/succ.rb, line 13 def succ self.to_s.succ.intern end
Turn a symbol into a proc calling the method to which it refers.
up = :upcase.to_proc up.call("hello") #=> HELLO
More useful is the fact that this allows & to be used to coerce Symbol into Proc.
%w{foo bar qux}.map(&:upcase) #=> ["FOO","BAR","QUX"] [1, 2, 3].inject(&:+) #=> 6
And other conveniences such as:
%{john terry fiona}.map(&:capitalize) # -> %{John Terry Fiona} sum = numbers.inject(&:+)
TODO: This will be deprecated as of Ruby 1.9, since it will become standard Ruby.
CREDIT: Florian Gross (orignal), Nobuhiro Imai (current)
[ + ]
# File lib/core/facets/symbol/to_proc.rb, line 26 def to_proc Proc.new{|*args| args.shift.__send__(self, *args)} end
Prepend an "@" to the beginning of a symbol to make a instance variable name. This also replaces non-valid characters with underscores.
[ + ]
# File lib/core/facets/symbol/variablize.rb, line 7 def variablize "@#{self}".gsub(/\W/, '_').to_sym end
Add a "not" sign to the front of a symbol.
~:friend #=> :"~friend"
CREDIT: Trans
[ + ]
# File lib/core/facets/symbol/not.rb, line 20 def ~@ if self.to_s.slice(0,1) == '~' "#{self.to_s[1..-1]}".to_sym else "~#{self}".to_sym end end