Quick actions

cmd+k|ctrl+k

Navigation

Languages

check and reject nil arguments

Snippet info

Language

Ruby

Visibility

public

Author

hyrious

Created

2019-01-07T15:44:33Z

Updated

2019-01-07T15:44:33Z

# coding: utf-8
# [debug] check nil arguments, reject them if needed

module NilArgs
  Module.include self

  NilArgsHookedMethods = {}
  def nilargs sym
    old = instance_method sym
    NilArgsHookedMethods[self] ||= {}
    raise NameError if NilArgsHookedMethods[self][sym]
    NilArgsHookedMethods[self][sym] = true
    define_method sym do |*args, &blk|
      if args.any?(&:nil?)
        call = "#{self}.#{sym}(#{args.map(&:inspect).join(', ')})"
        puts "[debug#nilargs] #{call}"
      else
        old.bind(self).call(*args, &blk)
      end
    end
  rescue
    old = method sym
    define_singleton_method sym do |*args, &blk|
      if args.any?(&:nil?)
        call = "#{self}.#{sym}(#{args.map(&:inspect).join(', ')})"
        puts "[debug#nilargs] #{call}"
      else
        old.call(*args, &blk)
      end
    end
  end
end

class A
  nilargs def self.add(a, b)
    a + b
  end

  nilargs def add(a, b)
    a + b
  end
end

A.new.add 1, nil # [debug#nilargs] #<A:0x00000000050ae100>.add(1, nil)
A.add nil, 2     # [debug#nilargs] A.add(nil, 2)
INFO