我的python代码中有以下情况:
class Parent(object):
def run(self):
print "preparing for run"
self.runImpl()
print "run done"
class Child(Parent):
def runImpl(self):
print "child running"
Run Code Online (Sandbox Code Playgroud)
但是,我有几个这样的"装饰",前后"runImpl"后做不同的安装/拆卸步骤,我不喜欢来定义run(),runImpl(),runImplSingleProcess()等.
我正在寻找以下形式的解决方案:
class Parent(object):
@wrapping_child_call
def run(self, func_impl, *args, **kwargs)
print "preparing for run"
func_impl(*args, **kwargs)
print "run done"
class Child(Parent):
def run(self):
print "child running"
Run Code Online (Sandbox Code Playgroud)
通过这种方式,Child类几乎不需要知道这种情况.
多继承也可能存在问题.如果一个Child继承自Parent1和Parent2,老实说我不知道应该是什么样的正确行为.
有谁知道一个好的,自然的,完成这个的方式?还是我在这里强奸设计?
谢谢
Yonatan
所以,给出以下代码
type MyClass () =
let items = Dictionary<string,int>()
do
items.Add ("one",1)
items.Add ("two",2)
items.Add ("three",3)
member this.TryGetValue (key,value) =
items.TrygetValue (key,value)
let c = MyClass ()
let d = Dictionary<string,int> ()
d.Add ("one",1)
d.Add ("two",2)
d.Add ("three",3)
Run Code Online (Sandbox Code Playgroud)
以及以下测试代码
let r1,v1 = d.TryGetValue "one"
let r2,v2 = c.TryGetValue "one"
Run Code Online (Sandbox Code Playgroud)
r1,v1行正常工作.r2,v2线炸弹; 抱怨c.TryGetValue必须给出一个元组.有趣的是,在每行中,TryGetValue的签名是不同的.如何让我的自定义实现显示与BCL版本相同的行为?或者,问另一种方式,因为F#有(隐含的)的元组参数,令行禁止参数和BCL参数的概念,我知道如何咖喱和元组风格的区分,我怎么能强迫第三样式(一拉BCL方法)?
如果不清楚,请告诉我.
符合标准的C++实现是否允许实现某些行为,这些行为据说是在标准中实现定义的,因为在具有相同输入数据的相同编译一次程序的不同运行之间它是不同的?
例如,一个实现是否允许说"行为是在周末,否则",并根据这样的声明实现行为?
根据我的老师的说法,编写这样的用户定义函数是不好的做法:
int DoubleNumber(int Number)
{
return Number * 2;
}
int main()
{
cout << DoubleNumber(8);
}
Run Code Online (Sandbox Code Playgroud)
相反,他说总是使用前向声明,即使这些函数不需要彼此了解:
int DoubleNumber(int Number); // Forward declaration.
int main()
{
cout << DoubleNumber(8);
}
int DoubleNumber(int Number) // Implementation.
{
return Number * 2;
}
Run Code Online (Sandbox Code Playgroud)
我发现这个特别奇怪,因为他告诉我们前向声明和实现完全相同或者你会得到错误是多么重要.如果这是一个大问题,为什么不把它全部放在上面main()呢?
那么,同时申报和实施真的是不好的做法吗?它甚至重要吗?
我正在读" 计算机程序的结构和解释 "一书,我想逐步编写一个计划解释器.
你知道最容易阅读(和简短)的方案的实施吗?我将在C中制作一个JavaScript.
我在外部*.cpp文件中定义了一些函数(这里没有涉及的类),当然还有一个合适的*.h文件.
*.cpp文件中的某些函数仅用于其他地方的*.cpp文件中.*.h文件中甚至没有提到它们.
我应该将这些函数放入一个未命名的命名空间中,还是只能放在其他函数旁边?如果是这样,为什么我需要一个未命名的命名空间呢?我无法看到问题,因为无论如何都无法从外部访问这些功能.
在(最大)堆中,很容易及时找到最大的项目O(1),但要实际删除它,您需要复杂性O(log(n)).
因此,如果从堆中插入和删除两者O(log(n)),堆超过二叉树表示优先级队列的优点是什么?
collections implementation priority-queue binary-heap data-structures
如" 在C++中使用负数进行整数除法 "中所述,在C99之前的C中(即在C89中)和在C++之前的C++中(即在C++ 98和C++ 03中),用于整数除法计算,其中两个操作数都是负数,余数的符号(或等效地,商的舍入方向)是实现定义的.
然后是标准函数std::div,它被指定为将商截断为零(即,余数与被除数(分子)具有相同的符号)(例如,参见"div()库函数的目的是什么?"的答案.
这是glibc的div()(源代码)代码(也引用" Is div function useful(stdlib.h)? "):
(注:div_t定义为:
typedef struct
{
int quot;
int rem;
} div_t;
Run Code Online (Sandbox Code Playgroud)
- 结束说明.)
/* Return the `div_t' representation of NUMER over DENOM. */
div_t
div (numer, denom)
int numer, denom;
{
div_t result;
result.quot = numer / denom;
result.rem = numer % denom;
/* The ANSI standard says that |QUOT| <= |NUMER / DENOM|, where …Run Code Online (Sandbox Code Playgroud) String类有一些方法,我无法理解为什么它们是这样实现的... replace是其中之一.
public String replace(CharSequence target, CharSequence replacement) {
return Pattern.compile(target.toString(), Pattern.LITERAL).matcher(
this).replaceAll(Matcher.quoteReplacement(replacement.toString()));
}
Run Code Online (Sandbox Code Playgroud)
与更简单,更有效(快速!)的方法相比,是否有一些明显的优势?
public static String replace(String string, String searchFor, String replaceWith) {
StringBuilder result=new StringBuilder();
int index=0;
int beginIndex=0;
while((index=string.indexOf(searchFor, index))!=-1){
result.append(string.substring(beginIndex, index)+replaceWith);
index+=searchFor.length();
beginIndex=index;
}
result.append(string.substring(beginIndex, string.length()));
return result.toString();
}
Run Code Online (Sandbox Code Playgroud)
使用Java 7的统计数据:
1,000,000次迭代
将"b"替换为"abc"
结果中的"x" :"axc"
时间:
string.replace:485ms
string.replaceAll:490ms
optimize replace = 180ms
像Java 7拆分方法这样的代码经过大量优化,以尽可能避免模式编译/正则表达式处理:
public String[] split(String regex, int limit) {
/* fastpath if the regex is a
(1)one-char String and this character is …Run Code Online (Sandbox Code Playgroud) 我决定开始为Android编码。在做出决定之前,我花了很多时间来提高自己的Java技能,希望这对我进行Android开发也有帮助。
今天,在打开一些类(例如HashMap)之后,我看到Android实现不同于“常规”实现。
有人可以向我解释为什么与GUI和触摸无关的类需要在Android中以不同的方式实现吗?为什么不使用已经存在的同一个类?
我搜索了一个答案,但没有找到答案。如果已经问过这个问题,我将很高兴获得它的链接并锁定帖子。
implementation ×10
c++ ×4
java ×2
.net ×1
android ×1
binary-heap ×1
byref ×1
c ×1
collections ×1
decorator ×1
f# ×1
file ×1
glibc ×1
inheritance ×1
javascript ×1
jvm ×1
lisp ×1
methods ×1
namespaces ×1
python ×1
scheme ×1
sicp ×1
string ×1
wrapper ×1