忘了x = y在Ruby中让x引用与y相同的对象,我被咬了几次.在Ruby术语中,我已经习惯了语言x = y.dup.忘掉这一点,y当我认为在作业的右侧是安全的时候,我无意中改变了.
我可以看到,x = y没有特殊原因避免简单的任务是有意义的,但同样的事情可能潜伏在其他地方,如
name = (person.last_name.blank? ? 'unknown' : person.last_name)
Run Code Online (Sandbox Code Playgroud)
以后name << title实际上会更改person.last_name而不仅仅是名称.
如果这也发生在你身上,你是如何学会避免它的?是否有某些红旗或图案需要寻找?你对每个作业都怀疑吗?你经常使用.dup吗?我不知道Ruby的用法是否会成为我的第二天性,所以任何有用的提示都会受到欢迎.
这是我的代码:
#include<stdio.h>
#include<stdlib.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<fcntl.h>
#include<unistd.h>
#include<errno.h>
int main(int argc,char *argv[])
{
int oldfd;
int newfd;
if(argc!=2)
{
printf("Usgae : %s file_name\n",argv[0]);
exit(0);
}
oldfd=open(argv[1],O_RDWR|O_APPEND,S_IRWXU); // Opening the file in Read/Write mode
if (-1 == oldfd)
{
perror("Error opening file");
exit(0);
}
close(1); // closing stdout
newfd=dup(oldfd); //Now this newfd holds the value 1
close(oldfd); //closing the oldfd
printf("\nStack Overflow"); //Now this printf will print content into the file as stdout closed already
close(newfd);// closing newfd
return 0;
} …Run Code Online (Sandbox Code Playgroud) 这是从一个跟进的问题在这里.
我希望能够暂时将stdout重定向到临时文件,而python仍然可以打印到stdout.这将涉及以下步骤:
new)的副本tmp)tmpnewstdouttmp到"真正的"标准输出tmp我尝试通过以下方式实现上述方法:
import os
import subprocess
import sys
#A function that calls an external process to print to stdout as well as
#a python print to pythons stdout.
def Func(s, p = False):
subprocess.call('echo "{0}"'.format(s), shell = True)
if p:
print "print"
sil = list() # <-- Some list to store the content of the temp files
print …Run Code Online (Sandbox Code Playgroud) 我想在python应用程序中执行一个程序,它将在后台运行,但最终会到达前台.
GUI用于与之交互.但是控件是通过stdin和stdout上的控制台提供的.我希望能够使用我的应用程序的GUI来控制它,所以我的第一个想法是:
这在python中是否可以轻松实现?有没有其他方法来实现我想要的,那会是什么?
当涉及到复制文件描述符时,我能得到对 dup() 函数的真正简化的解释吗?我想使用管道,但我还必须让孩子从管道中读取(这是最简单的部分),但将数据写回父级。我应该使用另一个管道,还是可以使用相同的管道?
我想知道为什么dup总是在以下代码中返回零(其中打开一个文件,连续完成10个dup):
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
void main()
{
int i,fdo,fdd;
if((fdo = open("test", O_RDWR | O_CREAT, 0666)) < 0)
{
perror("main open");
return;
}
printf("main open: %d\n",fdo);
for(i=0; i< 10;i++)
{
if((fdd = dup(fdo) < 0 )) {
perror("dup");
return ;
}
printf("opened %d, duped: %d \n", fdo,fdd);
}
}
Run Code Online (Sandbox Code Playgroud)
当我运行程序时(在Linux 2.6.32-279.19.1.el6.i686,Netbsd或Solaris 5.9上),我得到以下结果:
main open: 3
opened 3, duped: 0
opened 3, duped: 0
opened 3, duped: 0
opened 3, duped: 0 …Run Code Online (Sandbox Code Playgroud) 这是一个代码片段。
int saved_stdout = dup(1);
int fd = open("file.txt", O_WRONLY | O_CREAT, 0640);
close(1);
dup(fd);
close(fd);
printf("This text should go into the file\n");
//restore stdout
dup2(saved_stdout, 1);
printf("stdout restore");
Run Code Online (Sandbox Code Playgroud)
我正在尝试了解 dup 和 dup2。所以我最初将我的 file.txt 连接到 stdout。所以每当我使用 printf 时,我应该写入 file.txt 而不是 stdout。但是,一旦我完成了这种用法,我也想将它恢复回来,所以我最后也使用了 dup2。
问题是文本“This text should go into the file\n”实际上从未进入文件,而是打印在标准输出上。为什么这样?我跟踪它,却发现 dup2 调用发生在 printf("This text..."); 之前。声明,为什么呢?
我有这样的哈希:
entity = {1=> nil, 2 => {3 => nil, 4 => 1}}
Run Code Online (Sandbox Code Playgroud)
我编写了一个函数,可以使用递归删除给定实体的空值.
def clear_null_values(entity)
entity.each do |key, value|
if value == nil || value.blank?
entity.delete(key)
elsif value.is_a? Hash
clear_null_values(value)
entity.delete(key) if value.blank?
end
end
end
Run Code Online (Sandbox Code Playgroud)
而且我还需要原始实体以用于其他目的.所以我复制了哈希变量,然后清除了空值.
final_entity = entity.dup
clear_null_values(entity)
puts entity
puts final_entity
Run Code Online (Sandbox Code Playgroud)
结果:
{2 => {4 => 1}}
{1=> nil, 2 => {4 => 1}} # the nested values are overwritten.
Run Code Online (Sandbox Code Playgroud)
理想情况下,final_entity应与原始实体相同.
问题1:为什么entity.dup复制只是外部的?
问题2:如何使final_entity成为原始实体的完全副本,即使我们修改实体,那么final_entity也不应该改变?