我知道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_bullet2或add_bullet_with_really_long_name.
要解决一些问题:
不,我无法创建Bullet类层次结构,因为它太慢了.管理项目符号的实际代码在C中,我的函数是围绕C API的包装器.
我知道关键字参数,但检查各种参数组合变得烦人,但默认参数有助于分配 acceleration=0
如果我定义这样的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)
可能的,或者如果可能,怎么办?
我有一个容纳数据的容器类.创建容器时,有不同的方法来传递数据.
在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) 我想像许多其他语言一样在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中有多个"初始化"方法?例如:一个方法除了一个参数而另一个方法除了三个?
就像是
class One
def initialize (a)
puts a
end
def initialize_1 (a,b)
puts a ,b
end
end
Run Code Online (Sandbox Code Playgroud) 输入字符串:
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)
但我想最后看到大写字符.
我想在我的课堂上写这个:
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 ×5
constructor ×2
overloading ×2
python ×2
idiomatic ×1
initializer ×1
sorting ×1
string ×1