我想在C程序中使用相同的变量名和不同的数据类型而不进行强制转换.
我真的想这样做,不要问为什么.
那我该怎么办呢?
如果在进行预防性设置时该变量不存在,我该如何处理错误?
是否需要良好的TCL代码?如果我们不在脚本中使用"unset"关键字会发生什么?我应该知道的任何不良影响?
我继承了一些遗留代码,由于"未设置"而导致的错误 - 不存在的变量正在推动我的问题!
我写了一个非常简单的'部署'脚本作为我的post-update钩子在我的裸git仓库中运行.
变量如下
live domain = ~/mydomain.com
staging domain = ~/stage.mydomain.com
git repo location = ~/git.mydomain.com/thisrepo.git (bare)
core = ~/git.mydomain.com/thisrepo.git
core == added remote into each live & stage gits
Run Code Online (Sandbox Code Playgroud)
既live与stage已经初始化的git回购(非裸)和我已经加入我的裸回购作为远程他们每个人(命名core),这样git pull core stage或git pull core live会从各自的拉动更新的文件branch中的core回购.
脚本如下:
#!/usr/bin/env ruby
# Loop over each passed in argument
ARGV.each do |branch|
# If it matches the stage then 'update' the staging files
if branch == "refs/heads/stage" …Run Code Online (Sandbox Code Playgroud) 在MongoDB中,更新修饰符unset的工作方式如下:
考虑具有集合用户的Mongo DB数据库db.用户包含以下格式的Document:
//Document for a user with username: joe
{
"_id" : ObjectId("4df5b9cf9f9a92b1584fff16"),
"relationships" : {
"enemies" : 2,
"friends" : 33,
"terminated" : "many"
},
"username" : "joe"
}
Run Code Online (Sandbox Code Playgroud)
如果我想删除已终止的密钥,我必须指定$ unset update修饰符,如下所示:
>db.users.update({"username":"joe"},{"$unset":{"relationships.terminated": "many"}});
Run Code Online (Sandbox Code Playgroud)
我的问题是,为什么我必须为$ unset 指定整个键值对,而不是简单地指定:
>db.users.update({"username":"joe"},{"$unset":{"relationships.terminated"}});
Mon Jun 13 13:25:57 SyntaxError: missing : after property id (shell):1
Run Code Online (Sandbox Code Playgroud)
为什么不?
编辑:
如果$ unset的方法是根据JSON规范指定整个键值对,或者在语句中添加"1"作为值,为什么Shell本身不能进行"1"替换?为什么不提供这样的功能?是否存在提供此类支持的陷阱?
我有id一个项目和id一个客户端,它们是以 JSON 格式传递的 php 会话。这些存储在全局变量中id_p,id_c因此我可以使用这些 id 进行多次插入和更新选择等。
当用户选择另一个项目或更改页面时,我需要取消设置这些变量。
null值传递php给全局变量以重置它们吗?php值php?进行查询的文件位于单独的文件中。今天在为博客编写文本分析工具时,我发现PHP行为对我来说非常奇怪,并且无法绕过它.在规范化文本时,我试图删除低于最小长度的单词,所以我在我的规范化方法中写了这个:
if ($this->minimumLength > 1) {
foreach ($string as &$word)
{
if (strlen($word) < $this->minimumLength) {
unset($word);
}
}
}
Run Code Online (Sandbox Code Playgroud)
奇怪的是,这会在我的数组中留下一些低于允许长度的单词.在我整个班级寻找错误之后,我试了一下:
if ($this->minimumLength > 1) {
foreach ($string as $key => $word)
{
if (strlen($word) < $this->minimumLength) {
unset($string[$key]);
}
}
}
Run Code Online (Sandbox Code Playgroud)
瞧!这非常有效.现在,为什么会发生这种情况?我查看了PHP文档,它说明:
如果一个PASSED BY REFERENCE变量在函数内部未设置(),则只销毁局部变量.调用环境中的变量将保留与调用unset()之前相同的值.
是否foreach充当这里的calling environment,因为它有它自己的范围是什么?
我了解 php 和 Web 编程的基础知识。这是我的 php 代码。我见过几个类似的问题。他们使用 unset 函数取消设置全局变量。我希望每次用户打开网址时,都会出现用户名和密码提示,输入用户名密码后,如果正确,则下载文件并删除用户名和密码,如果错误,则删除用户名和密码,并再次提示输入用户名密码。
<?php
function destroy_foo()
{
if (isset($_SERVER['PHP_AUTH_USER'])) {
unset($_SERVER['PHP_AUTH_USER']);
}
if (isset($_SERVER['PHP_AUTH_PW'])) {
unset($_SERVER['PHP_AUTH_PW']);
}
}
if (!isset($_SERVER['PHP_AUTH_USER'])) {
header('WWW-Authenticate: Basic realm="My Realm"');
header('HTTP/1.0 401 Unauthorized');
echo 'Text to send if user hits Cancel button';
exit;
} else {
echo "<p>Hello {$_SERVER['PHP_AUTH_USER']}.</p>";
echo "<p>You entered {$_SERVER['PHP_AUTH_PW']} as your password.</p>";
$file = 'welcome.txt';
if($_SERVER['PHP_AUTH_PW'] == "admin" && $_SERVER['PHP_AUTH_USER'] =="admin"){
destroy_foo();
if (file_exists($file)) {
//Do some task
destroy_foo();
exit;
}
}
else
{
//Do …Run Code Online (Sandbox Code Playgroud) 我的代码:
$a = [];
isset($a[0]) and unset($a[0]);
Run Code Online (Sandbox Code Playgroud)
表明 "syntax error, unexpected 'unset' (T_UNSET)"
但
$a = [];
isset($a[0]) and exit();
Run Code Online (Sandbox Code Playgroud)
它有效!
两者的exit()和unset()正在返回没有价值.为什么一个工作而另一个工作?
编辑:这已被确认是一个错误并将被修复:https : //lists.gnu.org/archive/html/bug-bash/2018-03/msg00055.html
所以我在搞砸 bash 的间接功能,namerefs。我以为我已经掌握了它的窍门,但是当我试图弄清楚如何将 namerefs 转换为常规变量时,我遇到了一些让我困惑的事情。
这是来自man bash:的相关段落:
declare -n为每个名称指定 nameref 属性,使其成为对另一个变量的名称引用。另一个变量由 name 的值定义。除了使用或更改 -n 属性本身的那些引用、赋值和属性修改之外,所有对 name 的引用、赋值和属性修改都是在 name 值引用的变量上执行的。
因此,假设您想取消设置 nameref——不是它指向的变量,而是变量本身。您不能只说unset foo,因为这实际上会取消设置foo指向的任何内容;相反,您必须将其设为常规变量,然后取消设置:
$ declare -p
$ foo=bar; bar='hello world'
$ declare -p
declare -- foo="bar"
declare -- bar="hello world"
$ declare -n foo; declare -p # 'foo' is now a nameref
declare -n foo="bar"
declare -- bar="hello world"
$ declare +n foo; declare -p # …Run Code Online (Sandbox Code Playgroud) 所以基本上我做了这种情况,父母有 css all: unset。
然后我注意到当我使用 Safari(Version 12.1.1 (14607.2.6.1.1)) 时,它的所有子项颜色只能受*块影响,甚至不能内联或!important.
但只有color这样,正如您所看到的那样,background-color它正在使用它自己的属性。
但它在 Chrome 中运行良好,是 safari 中的故障还是我做错了什么?我该如何在 Safari 中修复它?
* {
color: red; /* Text color is using this one */
background-color: pink;
}
.Parent {
all: unset;
}
.Child {
color: blue;
background-color: yellow; /* Background color is using this one */
}Run Code Online (Sandbox Code Playgroud)
<div class="Parent">
<div class="Child">Some Text</div>
</div>Run Code Online (Sandbox Code Playgroud)