-1

次のようなコードがありました。

def my_function(obj)
  if obj.type == 'a'
    return [:something]
  elsif obj.type == 'b'
    return []
  elsif obj.type == 'c'
    return [obj]
  elsif obj.type == 'd'
    return [obj]*2
  end
end

if...elsifこれらすべてのブロックを次のような関数に分割したいと思います。

def my_function_with_a
  return [:something]
end

def my_function_with_b
   return []
end

def my_function_with_c(a_parameter)
  return [a_parameter]
end

def my_function_with_d(a_parameter)
  return [a_parameter] * 2
end

これらの関数を

def my_function(obj)
  send(:"my_function_with_#{obj.type}", obj)
end

問題は、パラメータが必要な関数と必要でない関数があることです。を簡単に定義できますdef my_function_with_a(nothing=nil)が、これを行うためのより良い解決策があると確信しています。

@Dogbert には素晴らしいアイデアがありましたarity。私はこのような解決策を持っています:

def my_function(obj)
  my_method = self.method("my_function_with_#{obj.type}")
  return (method.arity.zero? ? method.call : method.call(obj))
end
4

5 に答える 5

3

Ruby でメソッドを呼び出す方法を確認してください。そのために、この 2 つのリソースをお勧めします: wikibooksenter link description here

次のようなメソッドを定義できるオプションの引数については、特に注意してください。

def method(*args)
end

そして、次のように呼び出します。

方法

メソッド(arg1)

メソッド (引数 1、引数 2)

于 2013-05-15T13:43:09.403 に答える
2
def foo(*args)
  [ 'foo' ].push(*args)
end

>> foo
=> [ 'foo' ]
>> foo('bar')
=> [ 'foo', 'bar' ]
>> foo('bar', 'baz')
=> [ 'foo', 'bar', 'baz' ]
于 2013-05-15T13:40:51.570 に答える
1
def my_function(obj)
  method = method("my_function_with_#{obj.type}")
  method.call(*[obj].first(method.arity))
end
于 2013-05-15T14:38:45.240 に答える
0

デフォルト値を使用できます

def fun(a_param = nil)
    if a_param
        return ['raboof',a_param]
    else
        return ['raboof']
    end
end

また...

def fun(a_param : nil)
    if a_param
        return ['raboof',a_param]
    else
        return ['raboof']
    end
end

後者は、複数のパラメーターがある場合に便利です。これを呼び出すと、現在重要なパラメーターを渡すことができるからです。

fun(a_param:"Hooray")
于 2013-05-15T13:31:39.247 に答える