Casting string to IO?

I’m reading log file settings from a YAML file. Since Logger.new can
take either an IO object or string, the YAML could look like:

logger:
output: STDOUT

or

logger:
output: /foo/bar

The problem is that the YAML structure is loaded as strings, so if I
specify STDOUT I get a log file named “STDOUT”. Is there an elegant way
around this problem? I see two less-elegant ways:

if yaml[“logger”][“output”] == “STDOUT” then
log = Logger.new(STDOUT)
else

end

or

log = eval(‘Logger.new(’ + yaml[“logger”][“output”] + ‘)’)

etc.

I know casting is bad. Any suggestions appreciated. Thanks!

Adam B. wrote:

I’m reading log file settings from a YAML file. Since Logger.new can
take either an IO object or string, the YAML could look like:

logger:
output: STDOUT

or

logger:
output: /foo/bar

The problem is that the YAML structure is loaded as strings, so if I
specify STDOUT I get a log file named “STDOUT”. Is there an elegant way
around this problem? I see two less-elegant ways:

if yaml[“logger”][“output”] == “STDOUT” then
log = Logger.new(STDOUT)
else

end

or

log = eval(‘Logger.new(’ + yaml[“logger”][“output”] + ‘)’)

etc.

I know casting is bad. Any suggestions appreciated. Thanks!

The problem is that you are not casting, you are dealing with
variable names (symbolic names) versus variable contents. In
that light, your solutions are fine unless you have/make a
filesystem file corresponding to STDOUT :slight_smile:

Adam B. [email protected] writes:

The problem is that the YAML structure is loaded as strings, so if I
specify STDOUT I get a log file named “STDOUT”. Is there an elegant way
around this problem? I see two less-elegant ways:

[snip]

I know casting is bad. Any suggestions appreciated. Thanks!

Module#const_get might help you out:

require ‘logger’
output = “STDOUT”
output = Kernel.const_get(output) rescue output
log = Logger.new(output)
log.instance_variable_get(“@logdev”).dev == STDOUT # => true

  • Marshall

Very nice! Thanks!

output = Kernel.const_get(output) rescue output

Adam B. wrote:

I know casting is bad.

This is probably coercion, not casting. The latter I tend to associate with conversion between almost-but-not-quite-compatible and maybe-but-we-can't-tell-until-we-try-compatible types.

David V.