小编pkp*_*pnd的帖子

加法赋值+ =表达式中的行为

最近我遇到了这个问题:分配运营商链理解.

在回答这个问题,我开始怀疑我自己的加法赋值运算符的行为的理解+=或任何其他operator=(&=,*=,/=等).

我的问题是,a下面的表达式中的变量何时更新到位,以便在评估期间其更改的值反映在表达式的其他位置,它背后的逻辑是什么?请看下面两个表达式:

表达1

a = 1
b = (a += (a += a))
//b = 3 is the result, but if a were updated in place then it should've been 4
Run Code Online (Sandbox Code Playgroud)

表达2

a = 1
b = (a += a) + (a += a)
//b = 6 is the result, but if a is not updated in place then it should've been 4
Run Code Online (Sandbox Code Playgroud)

在第一个表达式中,当(a …

javascript java language-lawyer compound-assignment

58
推荐指数
2
解决办法
2782
查看次数

从源代码字符串中提取Python函数源文本

假设我有一个有效的Python源代码,作为一个字符串:

code_string = """
# A comment.
def foo(a, b):
  return a + b
class Bar(object):
  def __init__(self):
    self.my_list = [
        'a',
        'b',
    ]
""".strip()
Run Code Online (Sandbox Code Playgroud)

目标:我想获取包含函数定义源代码的行,保留空格.对于上面的代码字符串,我想得到字符串

def foo(a, b):
  return a + b
Run Code Online (Sandbox Code Playgroud)

  def __init__(self):
    self.my_list = [
        'a',
        'b',
    ]
Run Code Online (Sandbox Code Playgroud)

或者,相当于,我很乐意在代码字符串中获取函数的行号:foo跨越2-3行,并__init__跨越5-9行.

尝试

我可以将代码字符串解析为AST:

code_ast = ast.parse(code_string)
Run Code Online (Sandbox Code Playgroud)

我可以找到FunctionDef节点,例如:

function_def_nodes = [node for node in ast.walk(code_ast)
                      if isinstance(node, ast.FunctionDef)]
Run Code Online (Sandbox Code Playgroud)

每个FunctionDef节点的lineno属性告诉我们该函数的第一行.我们可以用以下方法估计该函数的最后一行:

last_line = max(node.lineno for node in ast.walk(function_def_node)
                if hasattr(node, …
Run Code Online (Sandbox Code Playgroud)

python

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

HTMLDocument文本中位置或偏移的含义

我试图理解位置/偏移是如何工作的HTMLDocument.这里描述位置/偏移语义.我的解释是,这些是屏幕字符序列中的索引HTMLDocument.

考虑从例如HTML HTMLDocument文件:

 <html>
   <head>
     <title>An example HTMLDocument</title>
     <style type="text/css">
       div { background-color: silver; }
       ul { color: red; }
     </style>
   </head>
   <body>
     <div id="BOX">
       <p>Paragraph 1</p>
       <p>Paragraph 2</p>
     </div>
   </body>
 </html>
Run Code Online (Sandbox Code Playgroud)

当我在浏览器中打开此HTML时,我只看到"段落1"和"段落2"(并且没有前导空格或换行符).所以我认为"第1段"从抵消开始0.

但请考虑以下代码,其中我打印示例HTML中的文本和正文的偏移量:

import java.io.StringReader;
import javax.swing.text.Element;
import javax.swing.text.html.*;

public class Test {
    public static void main(String[] args) throws Exception {
        String html = " <html>\n"
                    + "   <head>\n"
                    + "     <title>An example HTMLDocument</title>\n"
                    + " …
Run Code Online (Sandbox Code Playgroud)

html java swing

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

为什么我可以在Android AIDE中为最终变量重新分配新值?

这怎么可能?我怎样才能更改标记为final的变量?

public class Main
{
    public static void main(String[] args)
    {
        final int NUM;

        NUM = 22;
        NUM = 33;

        System.out.println(NUM);
    }

}
Run Code Online (Sandbox Code Playgroud)

我在Android中使用AIDE应用程序...它已成功编译并打印33.

java android final aide-ide

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

浮点乘法可以在C++中抛出异常吗?

这可能吗?我不认为是,但我不知道这是标准会说的,还是它的实施定义?我问,因为我想知道是否安全或者值得标记一个constexpr函数,比如noexcept

EX:

constexpr double to_meters(double y) noexcept? {
  return y * 10;
}
constexpr double x = to_meters(y); // Clang-Tidy warns about possible exception without noexcept
Run Code Online (Sandbox Code Playgroud)

c++ noexcept

7
推荐指数
2
解决办法
550
查看次数

首选可变或不可变集合作为方法参数

我正在编写一个将在多个地方使用的库方法。该方法的参数之一是对象的集合,该方法不会改变该集合。方法签名应该指定可变集合还是不可变集合?

选项 1:可变集合作为参数

public static void foo(List<Bar> list) {
  // ...
}
Run Code Online (Sandbox Code Playgroud)

优点:客户可以传入任何一个List<Bar>ImmutableList<Bar>对他们来说更方便的任何一个。

缺点:list参数不会被改变并不是很明显。客户必须阅读文档和/或代码才能实现这一点。无论如何,客户可能会制作不必要的防御性副本。

选项 2:不可变集合作为参数

public static void foo(ImmutableList<Bar> list) {
  // ...
}
Run Code Online (Sandbox Code Playgroud)

优点:客户端可以保证list参数不会被改变。

缺点:如果客户端有List<Bar>,他们必须先将其转换为 ,ImmutableList<Bar>然后再调用foo。这种转换浪费了很少的时间,而且不管客户喜欢与否,它都被强加给了客户。


注意:对于这个问题,我们假设所有客户端都可以使用 Guava ImmutableList,例如,因为库和客户端代码都属于已经ImmutableList在其他地方使用的相同代码库。

java immutability

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

用于调用重载方法的Java反射Area.equals(Area)

正如在这个问题中讨论的那样,equals方法java.awt.geom.Area被定义为

public boolean equals(Area other)

而不是重写equals方法Object.这个问题涵盖了"为什么",我对"如何强制Java使用最合适的equals方法" 感兴趣.

考虑这个例子:

public static void main(String[] args) {
    Class<?> cls = Area.class;
    Area a1 = new Area(new Rectangle2D.Double(1, 2, 3, 4));
    Area a2 = new Area(new Rectangle2D.Double(1, 2, 3, 4));
    System.out.println("Areas equal: " + a1.equals(a2)); // true

    Object o1 = (Object) a1;
    Object o2 = (Object) a2;
    System.out.println("Objects equal: " + o1.equals(o2)); // false

    // Given only cls, o1, and o2, how …
Run Code Online (Sandbox Code Playgroud)

java reflection equals

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

JAVA 中 API 链的最佳设计模式

我想在 Java 中调用一系列 API 调用。要求是在后续的 API 调用请求中会用到一些 API 的响应。我可以使用某些循环来实现这一点。但我想以实现通用的方式使用设计模式。有什么帮助吗?

责任链不能满足我的需要,因为一开始我不知道我的请求上下文是什么。

String out = null;
Response res = execute(req);
out += res.getOut();
req.setXYZ(res.getXYZ);
Response res = execute(req);
out += res.getOut();
req.setABC(res.getABC);
Response res = execute(req);
out += res.getOut();

System.out.println("Final response::"+out);
Run Code Online (Sandbox Code Playgroud)

java api design-patterns method-chaining

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

如何在 IntelliJ 的 sonarlint 插件中禁用 todo 警告?

Intellij 的 SonarLint 插件也为 TODO 提供警告。

默认情况下,Intellij 会突出显示 TODO 并将它们显示在提交对话框中。SonarLint 再次突出显示它是多余的。

此外,它还抑制了 Intellij 的一项有用功能 - Intellij 用蓝色突出显示 TODO,更容易识别和滚动到。

由于 SonarLint 插件,此功能被抑制。所以,我只想对待办事项禁用 sonarlint 警告。我怎样才能做到这一点?

intellij-idea suppress-warnings sonarlint sonarlint-intellij

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

用于管理任务组的设计模式

我有一个处理Task对象的系统,现在我想进行一些基准测试。具体来说,我将创建许多(~100)个Task对象,每个对象都属于一组任务,并且我想在整个任务组上运行系统。我想要一种设计,可以轻松创建新的Task并将其与组相关联(轻松实现基准套件的多样化)。只有少数几个组,因此可以接受一些每组基础设施。

Tasks 可以包含任意Objects,所以我不能从像 JSON 这样的“数据”文件类型加载它们——只有 Java 代码足够通用来创建Tasks。此外,为了可维护性,我想Task在单独的 Java 文件中创建每个:

// SolveHaltingProblem.java
public class SolveHaltingProblem {
    static Task getTask() {
        Task task = new Task();
        task.setName("SolveHaltingProblem");
        ... // Create task
        return task;
    }

    static String getGroup() {
        return "impossible-tasks";
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,应该很容易收集Tasks组:

List<Task> tasks = gatherTasksInGroup("impossible-tasks");
Run Code Online (Sandbox Code Playgroud)

没有一些愚蠢和容易出错的东西,比如:

List<Task> gatherTasksInGroup(String groupName) {
    List<Task> list = new ArrayList<>();
    if (groupName.equals("impossible-tasks")) {
        list.add(SolveHaltingProblem.getTask());
        list.add(SomeOtherHardProblem.getTask());
        ...
    } else …
Run Code Online (Sandbox Code Playgroud)

java design-patterns

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