小编Xaq*_*Xaq的帖子

在调用/编辑命令时,将ANSI颜色转义序列添加到bash提示符会导致光标位置错误

如果我设置我的命令提示符,如:

export PS1='\033[0;33m[\u@\h \w]\$ \033[00m'
Run Code Online (Sandbox Code Playgroud)

提示的颜色将为黄色,"$"字符后面的所有内容都将是默认的终端颜色.这就是我的期望.但是,如果我回想起一个命令行并尝试编辑它,移动光标 - 如果命令行我正在尝试编辑,则移动光标 - UpArrow/Ctrl-A(设置-o emacs)或ESC K(设置-o vi)足够长,光标不位于命令的开头.键入Ctrl-A(设置-o emacs)或^(设置-o vi)不会将光标移动到我看到的屏幕上调用行的开头.类似地,尝试将光标定位到行的末尾(Ctrl-E或$,取决于)会导致将多个字符放置在看似行的末尾.看起来bash被我添加到提示符中的转义字符搞糊涂了.

bash ansi command-prompt cursor-position

13
推荐指数
1
解决办法
1503
查看次数

在没有数组变量的情况下迭代java中的静态数组

在Ruby中,我可以做类似的事情:

["FOO", "BAR"].each do { |str| puts str }
Run Code Online (Sandbox Code Playgroud)

迭代我正在使用它的语句中定义的数组.因为我可以在Java中定义一个数组,如:

String[] array = { "FOO", "BAR" };
Run Code Online (Sandbox Code Playgroud)

我知道我可以通过设置一个循环来避免定义变量:

for (String str : new String[] { "FOO", "BAR" }) { ... }
Run Code Online (Sandbox Code Playgroud)

但是,我希望java可能有更简洁的东西,没有先定义包含数组的变量,并且还允许我避免动态分配,是否有如下语法:

for (String str : { "FOO", "BAR" }) { ... }
Run Code Online (Sandbox Code Playgroud)

这更简洁,适用于我缺少的Java,或者是我的唯一选择之上的解决方案?

java arrays iteration foreach array-initialization

13
推荐指数
2
解决办法
4263
查看次数

了解java泛型方法

我正在尝试理解Java中的泛型方法.给出以下代码:

public class GenericTest {

    interface Shape {
        public long area();
    }

    public static class Triangle implements Shape
    {
        private long base, height;
        public long area() { return (base * height) / 2; }
    }

    public static  class Rectangle implements Shape
    {
        private long width, height;
        public long area() { return width * height; }
    }

    public <T extends Shape> long area1(T shape)
    {
        return shape.area();
    }

    public long area2(Shape shape)
    {
        return shape.area();
    }

}
Run Code Online (Sandbox Code Playgroud)

我无法看到/理解为什么我应该使用/实现area1而不是area2(反之亦然).我错过了什么吗?这两种方法都不一样吗?

它让我对Java中的泛型有点困惑

java generics

5
推荐指数
2
解决办法
211
查看次数

如何只在Java中初始化一个局部变量一次

在C++中,以下代码:

#include <stdio.h>

static const char *init()
{
    printf("in init()\n");
}

static void func()
{
    static const char *str = init();
    printf("in func()\n");
}

int main()
{
    for (int i=0; i<10; ++i) {
        func();
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

表明尽管有很多func()的调用,str只是通过在用于初始化str的函数init()中打印跟踪消息来初始化一次.运行时,总共有10行跟踪,一次用于init(),10次用于func()

在Java中,下面的代码不应该做同样的事情吗?

class test {
    private String init()
    {
        System.out.println("in init()");
        return "FOO";
    }

    private void func()
    {
        final String str = init();
        System.out.println("in func()");
    }

    public test()
    {
        for (int …
Run Code Online (Sandbox Code Playgroud)

java final initialization variable-assignment

5
推荐指数
2
解决办法
8339
查看次数

仅当输入大于屏幕尺寸时如何减少分页?

如果我想在程序的输出超过屏幕上的行数时清除屏幕并减少运行,我可以执行以下操作:

mypgm | tee mypgm.out
LEN=$(wc -l mypgm.out | cut -f1 -d' ')
[[ $LEN >= $LINES ]]; then
   clear
   less -R mypgm.out
fi
Run Code Online (Sandbox Code Playgroud)

只要输出中的任何行都没有环绕,它就可以正常工作,视觉上在屏幕上占据了不止一行。有没有一种简单的方法可以确定输出在视觉上占据了多少行,或者我是否必须循环输出文件,使用 $COLUMNS 计算长行需要显示的“行”数

linux bash terminal less-unix

1
推荐指数
1
解决办法
585
查看次数

C++从基类调用派生类中的函数而不进行强制转换,也没有虚拟方法

我最近在接受采访时被问到这个问题:

#include <iostream>
class Base
{
public:
    void foo() { std::cout << "foo" << std::endl; }
};

class Derived : public Base
{
public:
    void bar() { std::cout << "bar" << std::endl; }
};

int main(int argc, const char *argv[])
{
    Base *p = new Derived;
    // additional code here
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

问题的条件是Base和Derived类无法更改(例如更改方法的名称,添加其他方法或将方法更改为virtual.进一步的限制是不能使用任何类型的强制转换.必须使用指针p.除此之外,您可以编写任何其他代码,包括必要的多个类,以确保使用p指向的对象调用"bar()"方法.

鉴于没有允许演员阵容,我能想到的唯一一个是老派的:

Derived *d;
memcpy(&d, &p, sizeof p);
d->bar();
Run Code Online (Sandbox Code Playgroud)

这比演员更糟糕.面试官骂我并告诉我,我甚至没有最基本的对象层次结构知识,因为我看不出这个问题的非常明显,微不足道的解决方案.

如果这个问题是重复,我道歉; 我已经看到了有关从基类访问派生类中的方法的其他问题,但在我看到的所有情况下,答案都涉及对任一类的强制转换或修改.

他可能是正确的; 我用C++编程超过15年,我看不到解决方案.可能是我从未遇到过它,因为在这种情况下我会使用强制转换:在这种情况下,它必须是static_cast,因为没有虚拟方法(甚至是析构函数)都不允许dynamic_vast编译(它失败并显示一条消息:"'Base'不是多态类型"

c++ inheritance

-1
推荐指数
1
解决办法
596
查看次数