Project

General

Profile

Bug #16086

OpenStruct method access with a block does not raise

Added by kke (Kimmo Lehto) about 1 year ago. Updated about 1 year ago.

Status:
Closed
Priority:
Normal
Assignee:
-
Target version:
-
[ruby-core:94195]

Description

This can cause confusion.

  > OpenStruct.new(hello: 'world').each { |k, v| puts k.upcase } # there's no "each" method
  => nil
  > OpenStruct.new(hello: 'world').eahc_pair { |k, v| puts k.upcase } # each_pair typo
  => nil

An undefined key with a block should maybe raise NoMethodError or ArgumentError?

A defined key with a block seems to yield the value, I don't see this being documented:

  > OpenStruct.new(hello: 'world').hello { |k| puts k.upcase } 
  HELLO

Maybe it should raise ArgumentError too?

Related: https://bugs.ruby-lang.org/issues/15515

Updated by nobu (Nobuyoshi Nakada) about 1 year ago

  • Status changed from Open to Feedback

kke (Kimmo Lehto) wrote:

This can cause confusion.

  > OpenStruct.new(hello: 'world').each { |k, v| puts k.upcase } # there's no "each" method
  => nil
  > OpenStruct.new(hello: 'world').eahc_pair { |k, v| puts k.upcase } # each_pair typo
  => nil

An undefined key with a block should maybe raise NoMethodError or ArgumentError?

That is OpenStruct, an undefined key does not raise an exception.
And an unused block is silently ignored in common.

A defined key with a block seems to yield the value, I don't see this being documented:

  > OpenStruct.new(hello: 'world').hello { |k| puts k.upcase } 
  HELLO

Maybe it should raise ArgumentError too?

I haven't seen such behavior.

$ ruby -rostruct -e 'p OpenStruct.new(hello: "world").hello { |k| puts k.upcase }'
"world"

Updated by kke (Kimmo Lehto) about 1 year ago

That is OpenStruct, an undefined key does not raise an exception.
And an unused block is silently ignored in common.

Right, this behavior seems to be universal:

> { foo: :bar }[:foo] { 'hello' }
=> :bar
> 1.abs { 'hello' }
=> 1

I haven't seen such behavior.

$ ruby -rostruct -e 'p OpenStruct.new(hello: "world").hello { |k| puts k.upcase }'
"world"

Hmm, I can't replicate it anymore either. I must have been experimenting with each_pair.

I guess nothing in this issue is actually an issue and it can be closed. This came from frustration when I assumed there was an each method and all I got was nil and couldn't figure out why.

#3

Updated by kke (Kimmo Lehto) about 1 year ago

  • Status changed from Feedback to Closed

Also available in: Atom PDF