temporarily redefine the 'puts' command?

A

aidy

Hi,

Is it possible to temporarily redefine the 'puts' command?

I have a gem that unnecessarily writes to the console, which effects
the Rspec Story Runner logging,

I do not want to manual comment out the puts as I use this gem on
numerous machines

Aidy
 
P

Phill Davies

Sure you can, that's one of the beautiful things about Ruby.

module Kernel
def puts (s)
# Do whatever you want here, including nothing
end
end
 
D

Daniel Lucraft

aidy said:
Hi,

Is it possible to temporarily redefine the 'puts' command?

I have a gem that unnecessarily writes to the console, which effects
the Rspec Story Runner logging,

I do not want to manual comment out the puts as I use this gem on
numerous machines

Aidy


$ irb
irb(main):001:0> alias :eek:ldputs :puts
=> nil
irb(main):002:0> def puts(*args); end
=> nil
irb(main):003:0> puts "hi"
=> nil
irb(main):004:0> alias :puts :eek:ldputs
=> nil
irb(main):005:0> puts "hi"
hi
=> nil

howzat?

You probably want to explicitly do it in Kernel when you do it for real.
Something like this, if you need to do it dynamically.
eval %Q{
module Kernel
alias :eek:ldputs :puts
def puts(*args)
end
end
}

best,
Dan
 
E

Eric I.

Is it possible to temporarily redefine the 'puts' command?

I have a gem that unnecessarily writes to the console, which effects
the Rspec Story Runner logging,

I do not want to manual comment out the puts as I use this gem on
numerous machines

Hi Aidy,

Here's some code, which should work for you. Of course you'll have to
answer the questions as where to put the methods puts_on and puts_off
(or whatever you decide to name them).

====

# replaces Kernel#puts w/ do-nothing method
def puts_off
Kernel.module_eval %q{
def puts(*args)
end
}
end

# restores Kernel#puts to its original definition
def puts_on
Kernel.module_eval %q{
def puts(*args)
$stdout.puts(*args)
end
}
end

puts "You can see me."
puts_off
puts "But I'm hidden."
puts_on
puts "But I'm viewable once again."

====

Eric

====

Interested in hands-on, on-site Ruby or Ruby on Rails
training? See http://LearnRuby.com for information about a
well-reviewed courses.
 
M

Matthias Reitinger

aidy said:
Is it possible to temporarily redefine the 'puts' command?

I would suggest to reassign $stdout instead. This ensures that print,
putc et cetera won't output anything either.

---
class DevNull; def write(*args) end end

$stdout = DevNull.new
puts "This output will be discarded."
$stout = STDOUT
puts "And this one won't!"
---

You could even wrap this up in a nice helper method:

---
class DevNull; def write(*args) end end

module Kernel
def silent
$stdout = DevNull.new
yield
$stdout = STDOUT
end
end

silent do
puts "Nothing to see here..."
print "... and there!"
end
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,769
Messages
2,569,579
Members
45,053
Latest member
BrodieSola

Latest Threads

Top