{"record":{"id":"251686b6933e4aa6","repo":"ruby-concurrency/concurrent-ruby","slug":"no-member-member-in-struct","errorCode":null,"errorMessage":"no member '#{member}' in struct","messagePattern":"no member '#(.+?)' in struct","errorType":"exception","errorClass":"NameError","httpStatus":null,"severity":"error","filePath":"lib/concurrent-ruby/concurrent/mutable_struct.rb","lineNumber":196,"sourceCode":"    #   @param [Symbol, String, Integer] member the string or symbol name of the member\n    #     for which to obtain the value or the member's index\n    #\n    #   @return [Object] the value of the given struct member or the member at the given index.\n    #\n    #   @raise [NameError] if the name does not exist\n    #   @raise [IndexError] if the index is out of range.\n    def []=(member, value)\n      if member.is_a? Integer\n        length = synchronize { @values.length }\n        if member >= length\n          raise IndexError.new(\"offset #{member} too large for struct(size:#{length})\")\n        end\n        synchronize { @values[member] = value }\n      else\n        send(\"#{member}=\", value)\n      end\n    rescue NoMethodError\n      raise NameError.new(\"no member '#{member}' in struct\")\n    end\n\n    private\n\n    # @!visibility private\n    def initialize_copy(original)\n      synchronize do\n        super(original)\n        ns_initialize_copy\n      end\n    end\n\n    # @!macro struct_new\n    def self.new(*args, &block)\n      clazz_name = nil\n      if args.length == 0\n        raise ArgumentError.new('wrong number of arguments (0 for 1+)')\n      elsif args.length > 0 && args.first.is_a?(String)","sourceCodeStart":178,"sourceCodeEnd":214,"githubUrl":"https://github.com/ruby-concurrency/concurrent-ruby/blob/0b88d5ff75f69b3740c8f0868e76f833cb2fd45d/lib/concurrent-ruby/concurrent/mutable_struct.rb#L178-L214","documentation":"When MutableStruct#[]= receives a non-Integer member name, it dispatches via send(\"#{member}=\") ; if no such setter exists the resulting NoMethodError is rescued and re-raised as NameError \"no member 'x' in struct\". This gives struct member typos a clear, Ruby-Struct-like error instead of a raw NoMethodError backtrace.","triggerScenarios":"point[:z] = 1 on a struct defined with only :x, :y; string member with a typo: struct['nmae'] = v; member names sourced dynamically (symbols from JSON keys) that don't match the defined members.","commonSituations":"Typos in field names during refactors; mapping external hashes into structs where key sets drift between versions; renaming struct members without updating every write site.","solutions":["Check membership first: struct.class.members.include?(member.to_sym)","Fix the typo — compare against Klass.members output in a console","When mapping external keys, filter them through members before writing, or define the struct from the actual key set"],"exampleFix":"# before\npoint[:z] = 1\n\n# after\npoint[:x2] = 1 if point.class.members.include?(:x2)\n# or simply fix the name:\npoint[:x] = 1","handlingStrategy":"type-guard","validationCode":"member = member.to_sym\nraise NameError, \"unknown member #{member}; valid: #{struct.class.members.join(', ')}\" unless struct.class.members.include?(member)\nstruct[member] = value","typeGuard":"->(struct, m) { struct.class.members.include?(m.to_sym) }","tryCatchPattern":"begin\n  struct[member] = value\nrescue NameError => e\n  raise FieldError, \"#{e.message} (defined: #{struct.class.members.join(', ')})\"\nend","preventionTips":["Drive writes from Klass.members, not hand-typed names, when mapping hashes into structs","When struct members come from a schema, regenerate or verify them when the schema changes","Prefer symbol member names over strings to avoid silent to_sym mismatches"],"tags":["ruby","struct","name-error","typo","argument-validation"],"backgroundTag":"unknown-struct-member","analyzedSha":"0b88d5ff75f69b3740c8f0868e76f833cb2fd45d","analyzedAt":"2026-08-21T20:12:56.291Z","schemaVersion":2},"datasetVersion":"2026-08-21T23:17:16.201Z"}