我理解指针与引用的语法和一般语义,但是我应该如何决定何时在API中使用引用或指针?或多或少?
当然,有些情况需要一个或另一个(operator++需要一个引用参数),但总的来说,我发现我更喜欢使用指针(和const指针),因为语法清楚地表明变量是破坏性地传递的.
例如,在以下代码中:
void add_one(int& n) { n += 1; }
void add_one(int* const n) { *n += 1; }
int main() {
int a = 0;
add_one(a); // Not clear that a may be modified
add_one(&a); // 'a' is clearly being passed destructively
}
Run Code Online (Sandbox Code Playgroud)
使用指针,它总是(更加)明显地发生了什么,所以对于API等,清晰度是一个大问题,指针不是比引用更合适?这是否意味着只应在必要时使用引用(例如operator++)?是否有任何性能问题?
编辑(已完成):
除了允许NULL值和处理原始数组之外,似乎选择归结为个人偏好.我已经接受了下面引用Google的C++样式指南的答案,因为它们提出了"引用可能令人困惑,因为它们具有值语法但指针语义"的观点.
由于清理不应该为NULL的指针参数所需的额外工作(例如,add_one(0)将调用指针版本并在运行时中断),从可维护性的角度来看,使用必须存在对象的引用是有意义的,尽管这是一种耻辱失去句法的清晰度.
我用CTE写了一个'upsert'查询,看起来像这样:
WITH
new_data (id, value) AS (
VALUES (1, 2), (3, 4), ...
),
updated AS (
UPDATE table t set
value = t.value + new_data.value
FROM new_data
WHERE t.id = new_data.id
RETURNING t.*
)
INSERT INTO table (id, value)
SELECT id, value
FROM new_data
WHERE NOT EXISTS (
SELECT 1 FROM updated WHERE updated.id = new_data.id
)
Run Code Online (Sandbox Code Playgroud)
但是,我需要在我的应用程序中使用新值,但此查询不会返回任何内容.添加returning *到插入的末尾将返回已插入的所有行,但不会返回任何已更新的行.
那么,问题是(如何)我可以扩展它以返回已更新的行和插入的行?
编辑:当然我可以SELECT在一个事务中运行它然后运行,但我很想知道是否有单查询方式.
sql postgresql upsert common-table-expression postgresql-9.1
我正在用PHP 5.3编写一个库,其中大部分是一个具有多个静态属性的类,这些属性从子类扩展到允许子类的零-conf.
无论如何,这里有一个样本来说明我发现的特殊性:
<?php
class A {
protected static $a;
public static function out() { var_dump(static::$a); }
public static function setup($v) { static::$a =& $v; }
}
class B extends A {}
class C extends A {}
A::setup('A');
A::out(); // 'A'
B::out(); // null
C::out(); // null
B::setup('B');
A::out(); // 'A'
B::out(); // 'B'
C::out(); // null
C::setup('C');
A::out(); // 'A'
B::out(); // 'B'
C::out(); // 'C'
?>
Run Code Online (Sandbox Code Playgroud)
现在,就我而言,这是静态继承的非常理想的行为,然而,static::$a =& $v;改为static::$a = $v;(无引用)你得到我期望的行为,即:
'A'
'A'
'A' …Run Code Online (Sandbox Code Playgroud) 我现在正在使用Android,试图避免使用Eclipse(我对此有一种非理性的仇恨).
我需要包含一个外部.jar文件(在我用过Activity)并且不知道如何链接它ant debug...
我已经阅读了关于build.xml文件,但添加或节点的XML不会帮助解决问题.<path id="compiler.classpath">...</...><classpath>
希望有人能帮助我!
我正在试验PHP的PCRE中的命名子模式/'子程序'正则表达式功能,我希望有人可以解释以下奇怪的输出:
$re = "/
(?(DEFINE)
(?<a> a )
)
^(?&a)$
/x";
var_dump(preg_match($re, 'a', $match)); // (int) 1 as expected
var_dump($match); // Array( [0] => 'a' ) <-- Why?
Run Code Online (Sandbox Code Playgroud)
我无法理解为什么命名组"a"不在结果中(内容为"a").更改preg_match为preg_match_all在匹配数据中放置"a"和"1",但两者仅包含空字符串.
我非常喜欢用这种方式编写正则表达式的想法,因为你可以使它们非常强大,同时保持它们非常易于维护(请参阅这个答案以获得一个很好的例子),但是如果子模式在匹配数据中不可用那么它不是真的很有用.
我在这里遗漏了什么,或者我应该哀悼可能发生的事情并继续前进?
我正在开发一个 Zappa 应用程序,目前正在尝试制作一个小监视脚本,该脚本可以require.cache在文件更改时停止服务器、清除然后重新要求并重新启动服务器,例如:
# watch all dependent files
for file of require.cache
fs.watch file, ->
# attach a handler to 'close'
# -- here's the issue: this takes far too long to trigger
server.on 'close', ->
server = require './server'
server.start()
# log the new server's id
console.log server.id
# stop the current server instance
server.stop()
# clear require's cache
delete require.cache[f] for f of require.cache
Run Code Online (Sandbox Code Playgroud)
我的请求处理程序中还有一行console.log server.id,以便我可以检查 ID 是否匹配。
所以,发生的情况是:当我更改依赖项时,服务器停止,新的服务器启动并记录新的 ID,这一切都是肉汁。但是,在之后的一段随机时间内,对服务器的请求仍会记录旧 ID,这表明旧侦听器仍以某种方式附加。最终,侦听器似乎“切换”并记录了新的 ID。
更新:这似乎与事件有关 …
作为一个教育项目,我正在用JavaScript编写(又一个)编辑风格的实时语法高亮显示器.
为了保持编辑器的响应性,我显然选择了荧光笔异步运行,但是对于我正在使用的模型我需要能够在启动另一个之前终止一个荧光笔,如果在当前荧光笔完成之前键入了某些东西,并且知道它已经终止在新的开始之前.
我在考虑做以下事情:
var terminate = false;
var terminated = false;
function work() {
while(!terminate)
console.log('working');
terminated = true;
}
function stop() {
terminate = true;
while(!terminated);
console.log('stopped');
}
setTimeout(work, 0);
setTimeout(stop, 10);
Run Code Online (Sandbox Code Playgroud)
然而,这个例子不起作用,我尝试使用更多的setTimeouts代替繁忙的等待也无济于事.
有没有办法在JavaScript中实现这样的系统,或者我应该使用一些替代(或两者)?
php ×2
reference ×2
android ×1
c++ ×1
concurrency ×1
express ×1
inheritance ×1
java ×1
javascript ×1
node.js ×1
pcre ×1
php-5.3 ×1
pointers ×1
postgresql ×1
regex ×1
sql ×1
upsert ×1
zappa ×1