相关疑难解决方法(0)

Python函数重载

我知道Python不支持方法重载,但我遇到了一个问题,我似乎无法以一种漂亮的Pythonic方式解决这个问题.

我正在制作一个角色需要射击各种子弹的游戏,但是如何编写不同的功能来制作这些子弹呢?例如,假设我有一个函数可以创建一个以给定速度从A点到B点行进的子弹.我会写一个这样的函数:

    def add_bullet(sprite, start, headto, speed):
        ... Code ...
Run Code Online (Sandbox Code Playgroud)

但我想写其他功能来创建子弹,如:

    def add_bullet(sprite, start, direction, speed):
    def add_bullet(sprite, start, headto, spead, acceleration):
    def add_bullet(sprite, script): # For bullets that are controlled by a script
    def add_bullet(sprite, curve, speed): # for bullets with curved paths
    ... And so on ...
Run Code Online (Sandbox Code Playgroud)

等等有很多变化.有没有更好的方法来做到这一点,而不使用这么多的关键字参数导致它快速变得有点难看.重命名每个功能,因为你要么是非常糟糕过add_bullet1,add_bullet2add_bullet_with_really_long_name.

要解决一些问题:

  1. 不,我无法创建Bullet类层次结构,因为它太慢了.管理项目符号的实际代码在C中,我的函数是围绕C API的包装器.

  2. 我知道关键字参数,但检查各种参数组合变得烦人,但默认参数有助于分配 acceleration=0

python overloading

175
推荐指数
14
解决办法
20万
查看次数

Ruby可选参数

如果我定义这样的Ruby函数:

def ldap_get ( base_dn, filter, scope=LDAP::LDAP_SCOPE_SUBTREE, attrs=nil )
Run Code Online (Sandbox Code Playgroud)

我怎么称它只提供前2个和最后一个args?为什么不是这样的

ldap_get( base_dn, filter, , X)
Run Code Online (Sandbox Code Playgroud)

可能的,或者如果可能,怎么办?

ruby optional-parameters

120
推荐指数
3
解决办法
17万
查看次数

多个构造函数:Pythonic方式?

我有一个容纳数据的容器类.创建容器时,有不同的方法来传递数据.

  1. 传递包含数据的文件
  2. 通过参数直接传递数据
  3. 不要传递数据; 只需创建一个空容器

在Java中,我将创建三个构造函数.以下是在Python中可能出现的情况:

class Container:

    def __init__(self):
        self.timestamp = 0
        self.data = []
        self.metadata = {}

    def __init__(self, file):
        f = file.open()
        self.timestamp = f.get_timestamp()
        self.data = f.get_data()
        self.metadata = f.get_metadata()

    def __init__(self, timestamp, data, metadata):
        self.timestamp = timestamp
        self.data = data
        self.metadata = metadata
Run Code Online (Sandbox Code Playgroud)

在Python中,我看到了三个明显的解决方案,但它们都不是很漂亮:

:使用关键字参数:

def __init__(self, **kwargs):
    if 'file' in kwargs:
        ...
    elif 'timestamp' in kwargs and 'data' in kwargs and 'metadata' in kwargs:
        ...
    else:
        ... create empty container
Run Code Online (Sandbox Code Playgroud)

B:使用默认参数:

def …
Run Code Online (Sandbox Code Playgroud)

python constructor initialization idiomatic initializer

57
推荐指数
3
解决办法
1万
查看次数

在Ruby中重载

我想像许多其他语言一样在Ruby中使用重载功能,但Ruby本身不支持此功能.

我是否必须使用定义带*args参数的方法的方式来实现它,并确定方法内参数的数量和类型?有些人喜欢:

class A
    def foo(*args)
        case (args.length)
        when 1
            do something
        when 2
            do something-else
        ....
        end
    end
end
Run Code Online (Sandbox Code Playgroud)

你可以看到,它比直接重载更难看.

我想知道是否有任何关键字或其他方式(如元编程模块)可以让我以更优雅的方式定义重载方法.

ruby overloading

10
推荐指数
2
解决办法
7748
查看次数

在ruby中有多个构造函数

有没有办法在ruby中有多个"初始化"方法?例如:一个方法除了一个参数而另一个方法除了三个?

就像是

 class One
  def initialize (a)
    puts a
  end
  def initialize_1 (a,b)
    puts a ,b 
  end
end
Run Code Online (Sandbox Code Playgroud)

ruby constructor initialization

5
推荐指数
1
解决办法
7441
查看次数

Ruby自定义字符串排序

输入字符串:

1654AaBcDddeeFF 
Run Code Online (Sandbox Code Playgroud)

输出字符串:

1456acddeeABDFF
Run Code Online (Sandbox Code Playgroud)

我试过的代码:

test_array = []
'1654AaBcDddeeFF'.each_byte do |char|
  test_array << char
end

test_array.sort.pack('C*')
# => 1456ABDFFacddee
Run Code Online (Sandbox Code Playgroud)

但我想最后看到大写字符.

ruby sorting string

5
推荐指数
2
解决办法
707
查看次数

如何在Ruby中使用不同数量的参数编写两个方法

我想在我的课堂上写这个:

class << self
    def steps
      @steps.call
    end

    def transitions
      @transitions.call
    end

    def steps(&steps)
      @steps = steps
    end

    def transitions(&transitions)
      @transitions = transitions
    end
  end
Run Code Online (Sandbox Code Playgroud)

这是不行的,因为在Ruby中,我不能做这种方法重载.有没有解决的办法?

ruby

0
推荐指数
1
解决办法
56
查看次数