标签: shadowing

将符号解析为宏与函数参数的规则是什么?

我很惊讶地发现在Clojure 中alpha转换并不安全:

Clojure> ((fn [o] (o 3 2)) +)
5

Clojure> ((fn [or] (or 3 2)) +)
3

Clojure> ((fn [def] (def 3 2)) +)
java.lang.RuntimeException: First argument to def must be a Symbol
Run Code Online (Sandbox Code Playgroud)

(我预计所有三个片段都要评估为5).

当涉及阴影和宏以及特殊形式时,符号解析的规则是什么?

我正在使用Try Clojure上的版本.

variables macros clojure shadowing

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

阴影参数C++的有趣情况(参数未在if块中隐藏)

我惊讶地发现,以下代码完全有效(gcc 4.4.5):

int get_int(const int& i)
{
    if(i == 0)
    {
        int i = 1;
        return i;
    }
    return i;       
}
Run Code Online (Sandbox Code Playgroud)

我真的很惊讶.如果我必须接受它,那么我肯定可以说它有意义,因为新变量在它自己的块内,所以外面的其余代码仍然可以访问参数,所以参数不是真正的阴影.但是对我来说仍然没有意义,为什么我们不能使这个语法无效?我认为不允许这样做有什么好处,事实上,我只需要深入研究由此造成的错误.这是一个很长的函数,我创建了自己的变量而没有意识到它与参数具有相同的名称,并且稍后的某些代码行(相同的块)依赖于该参数变量,现在它正在使用我的版本我的日子里有一个小时.

我对编译器有很多表面知识,那么有人可以向我解释这种行为背后的全部故事吗?作为比较,在这样的Java代码中是无效的(重复变量).

c++ gcc shadowing

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

如何影子python内置的pwd模块

有一些python代码可以在Linux下运行.它以这样的方式使用pwd模块:

import pwd
   ...
  def func():
      user=pwd.getpwnam(user)[2]
Run Code Online (Sandbox Code Playgroud)

现在我们有一个特定的需要用测试来覆盖这个代码,测试必须在Windows下运行.程序本身只能在Linux下运行.问题是pwd模块在Windows下不可用,因此即使使用MagicMock模拟了pwd函数的实现,受测试的代码也会因ImportError而失败.

解决此问题的基本思想是在运行测试时隐藏pwd模块.因此,当运行测试时,存根将影响pwd,并且在运行主程序时,将使用原始(Unix)pwd.我们在测试PYTHONPATH时创建了这样的存根:

# pwd.py
def getpwnam(user):
    print("YESSSSSSSS")
Run Code Online (Sandbox Code Playgroud)

但它似乎没有影响一个pwd模块,在调试器中我们看到内置的pwd是导入的.我主要是一名Java开发人员,所以如果做事的方式不是"pythonic",我很抱歉.欢迎提出想法.

python windows built-in shadowing pwd

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

Java内部类阴影外部类

我从K&B书"SCJP Sun认证程序员Java 6学习指南"中获取了以下代码:

class A { // 1
    void m() { 
        System.out.println("outer"); 
    } 
}

public class TestInners {

    public static void main(String[] args) {

        new TestInners().go();

    }

    void go() {

        new A().m();

        class A { // 2
            void m() { 
                System.out.println("inner"); 
            } 
        }

    }

    class A { // 3
        void m() { 
            System.out.println("middle"); 
        } 
    }
}
Run Code Online (Sandbox Code Playgroud)

如书中所述,此代码打印"中间".我推断标记为"3"的类声明是标记为"1"的类,它是TestInners类的外部.如果这些类在不同的包中,我可以通过使用包名来限定其中一个来解决歧义.但在这种情况下,类不仅在同一个包中,而且在同一个文件中.如何获取外部类的实例?

我在这里看到了同样的问题,但是接受的答案意味着修改代码,为整个事物添加一个封闭的类.我的问题是如何使用任何类型的限定符或引用来获取实例,如果它甚至可能的话.

java class shadowing

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

可迭代实现中的Lambda表达式

所以我有我朋友给我看的这段代码,我必须承认我不明白发生了什么。我了解围绕lamba表达式的概念,到目前为止,已经在haskell中编写了很多表达式,但到目前为止在Java中都没有。

让我感到困惑的是,编译器如何知道我认为是lambdaed的函数应该是Iterable接口中所需的“ iterator()”。

public Iterable<V> values() {
    return () -> {
        return new Iterator<V>() {
            private Iterator<TableEntry<K, V>> iter = iterator();

            @Override
            public boolean hasNext() {
                return iter.hasNext();
            }

            @Override
            public V next() {
                return iter.next().getValue();
            }
        };
    };
}
Run Code Online (Sandbox Code Playgroud)

我有这个版本,但是我有一个阴影问题,我自己在内部调用实现值的Iterable的iterator()会导致堆栈溢出。我想要的是使用在values()范围内定义的iterator(),但不知道如何指向它。

public Iterable<V> values() {
    return new ValuesIterable<V>();
}

public class ValuesIterable<V> implements Iterable<V>{
    public Iterator<V> iterator() {
        return new ValuesIterator();
    }

    public class ValuesIterator implements Iterator<V>
    {
        Iterator<SimpleHashtable.TableEntry<K, V>> iter = (Iterator<TableEntry<K, V>>) iterator();

        public boolean hasNext()
        {
            return …
Run Code Online (Sandbox Code Playgroud)

java lambda iterable shadowing java-8

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

How does Tomcat handle overlapping/shadowing names in context paths or URLs?

How does Tomcat 8.0 serve http requests in the following scenario?

Let's say we have deployed the two web applications "ROOT.war" and "Foo.war" on a server with the name "www.host.com". Furthermore, let's assume that ROOT.war contains a subfolder named "Foo" which contains a file "mypage.html". Additonally, let's assume "Foo.war" also contains a file named "mypage.html". So after extraction of the war-files Tomcat's webapps directory should look like this:

webapps\ROOT\Foo\mypage.html
webapps\Foo\mypage.html
Run Code Online (Sandbox Code Playgroud)

If a user made a request to

http://www.host.com/Foo/mypage.html
Run Code Online (Sandbox Code Playgroud)

in his …

url tomcat shadowing overlapping contextpath

5
推荐指数
0
解决办法
145
查看次数

Ruby 局部变量隐藏实例方法的行为

我最近阅读了一篇关于 Ruby 的关于隐藏方法的局部变量的行为博客文章(与隐藏方法局部变量的块变量不同,这也在StackOverflow 线程中讨论过),我发现了一些行为我不太明白。

Ruby 的文档说

[V]变量名和方法名几乎相同。如果您没有指定这些含糊不清的名称之一,ruby 将假定您希望调用一个方法。一旦您分配了名称 ruby​​ 将假定您希望引用一个局部变量。

因此,给出以下示例类

# person.rb

class Person
  attr_accessor :name

  def initialize(name = nil)
    @name = name
  end

  def say_name
    if name.nil?
      name = "Unknown"
    end

    puts "My name is #{name.inspect}"
  end
end
Run Code Online (Sandbox Code Playgroud)

鉴于我现在通过阅读上述链接中的信息所了解的信息,我希望得到以下信息:

  • name.nil?语句仍将引用name由提供的实例方法attr_accessor
  • 当 Ruby 解析器看到方法中的name = "Unknown"赋值行时#say_name,它会考虑在赋值之后name使用的任何引用来引用局部变量
  • 因此,即使Person有一个name分配给它的初始化时,name在最后一行引用的#say_name方法是nil

看起来像 …

ruby shadowing pry

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

C ++:即使使用“ this”关键字,参数声明也会隐藏类成员

我最近开始使用“警告级别4”并将C ++编码时的警告视为错误。我想要一些有关以下代码段的更深入的信息:

struct Foo
{
    Foo(int size)
        //:size{ size } // <- More on this later.
    {
        this->size = size;
    }

    void func(int size)
    {
        this->size = size;
    }

    int size;
};

int main()
{
    Foo a{ 1 };
    a.func(2);
}
Run Code Online (Sandbox Code Playgroud)

因此,我从Visual Studio 2019中收到以下警告/错误:

错误:C2220-警告被视为错误-未生成任何“对象”文件。

警告:C4458-'size'声明隐藏了类成员。

该警告表示该size成员正在被也称为的方法的参数隐藏size。输出表明错误不是来自构造函数,而是来自func方法。我觉得这很令人困惑,因为构造函数似乎没有这个问题(实际上,删除func允许片段进行编译)。

降低警告级别可以使应用程序编译,并且看起来可以按预期运行。使用初始化程序列表而不是构造函数的主体(请参见注释行)似乎也可以工作,但是我猜测这是由于初始化程序列表语义所致。

我了解到该错误表明size参数名称funcFoo的同名成员冲突,但是this关键字不应该解决这种混淆吗?这仅仅是微软的编译器过于严格吗?

c++ this compiler-warnings shadowing visual-c++

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

在'case of'块中,绑定如何掩盖现有的绑定?

我不得不从提取用户名和电子邮件EitherAuthResponse

我使用case of它的构造:

  let (uname, uemail) =
        case getUserResponseJSON creds of
          Right (GoogleUserResponse uname uemail) -> (uname, uemail)
          _ -> ("", "")    
Run Code Online (Sandbox Code Playgroud)

但我对uname和都有此警告uemail

    This binding for ‘uname’ shadows the existing binding
      bound at src/Foundation.hs:240:12
    |
242 |               Right (GoogleUserResponse uname uemail) -> (uname, uemail)
    |  
Run Code Online (Sandbox Code Playgroud)

我希望这let (uname, uemail)超出了范围case of

case如果unameuemail尚未定义,如何从块中获得此警告?

haskell scope let shadowing letrec

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

C#vs VB.Net,阴影和[重载(不改变参数)]之间的区别是什么

很抱歉这个问题很长,但我对C#不熟悉(我曾经使用过VB.Net)

我完全理解VB.Net和C#中的重写重载之间的区别.所以覆盖没有问题.

现在,在VB.Net中,Shadowing(使用关键字Shadows)和Overloading(使用带有相同参数的关键字Overloads' )之间存在差异,如下所示:

  • 使用阴影时,它会以相同的名称隐藏每个方法 - 无论参数如何 - 只能成为一个方法(阴影方法).
  • 使用Overloads时 - 使用相同的参数 - 它仅重载(阴影)具有相同名称和参数的方法.

考虑以下代码:

Class A
    Sub MyMethod()
        Console.WriteLine("A.MyMethod")
    End Sub
    Sub MyMethod(ByVal x As Integer)
        Console.WriteLine("A.MyMethod (x)")
    End Sub
    Sub MyMethod2()
        Console.WriteLine("A.MyMethod2")
    End Sub
    Sub MyMethod2(ByVal x As Integer)
        Console.WriteLine("A.MyMethod2 (x)")
    End Sub
End Class

Class B
    Inherits A
    Overloads Sub MyMethod()
        Console.WriteLine("B.MyMethod")
    End Sub
    Shadows Sub MyMethod2()
        Console.WriteLine("B.MyMethod2")
    End Sub
End Class …
Run Code Online (Sandbox Code Playgroud)

c# vb.net oop overloading shadowing

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