小编Bak*_*riu的帖子

内存中的方法表示是什么?

在思考Java/C#中的编程时,我想知道如何在内存中表示属于对象的方法,以及这个事实如何涉及多线程.

  1. 是单独为内存中的每个对象实例化的方法,还是同一类型的所有对象共享方法的一个实例?
  2. 如果是后者,执行线程如何知道要使用哪个对象的属性?
  3. 是否可以在C#中使用反射修改方法的代码,并且只能修改同一类型的多个对象中的一个对象?
  4. 一个不使用类属性的静态方法总是线程安全吗?

我试着对这些问题下定决心,但我对他们的答案非常不确定.

c# java memory clr jvm

22
推荐指数
2
解决办法
2838
查看次数

字典理解中的操作顺序

我遇到了以下有趣的结构:

假设您有一个列表列表如下:

my_list = [['captain1', 'foo1', 'bar1', 'foobar1'], ['captain2', 'foo2', 'bar2', 'foobar2'], ...]
Run Code Online (Sandbox Code Playgroud)

并且你想用0-index元素作为键来创建一个字典.一个方便的方法是:

my_dict = {x.pop(0): x for x in my_list}
# {'captain1': ['foo1', 'bar1', 'foobar1'], ...}
Run Code Online (Sandbox Code Playgroud)

看起来,pop在将list x作为值分配之前,这就是为什么'captain'不出现在值中(它已经弹出)

现在让我们更进一步,尝试获得如下结构:

# {'captain1': {'column1': 'foo1', 'column2': 'bar1', 'column3': 'foobar1'}, ...}
Run Code Online (Sandbox Code Playgroud)

为此,我写了以下内容:

my_headers = ['column1', 'column2', 'column3']
my_dict = {x.pop(0): {k: v for k, v in zip(my_headers, x)} for x in my_list}
Run Code Online (Sandbox Code Playgroud)

但是这会返回:

# {'captain1': {'col3': 'bar1', 'col1': 'captain1', 'col2': 'foo1'}, 'captain2': {'col3': 'bar2', …
Run Code Online (Sandbox Code Playgroud)

python dictionary python-3.x

22
推荐指数
3
解决办法
2399
查看次数

为什么Object.create()和new Object()会评估不同的原型?

为什么这两个实现的行为不同?在评估他们的原型时,究竟是什么让他们与众不同?

使用指定的原型创建对象:

   function Foo() {}

   // creates an object with a specified prototype
   var bar = Object.create(Foo);

   console.log(Object.getPrototypeOf(bar)); // returns: function Foo(){}
   console.log(Foo.isPrototypeOf(bar)); // returns: true
Run Code Online (Sandbox Code Playgroud)

使用构造方法创建对象:

   function Foo() {}

   // creates an object with the constructor method    
   var bar = new Foo();

   console.log(Object.getPrototypeOf(bar)); // returns: Foo {}
   console.log(Foo.isPrototypeOf(bar)); // returns: false
Run Code Online (Sandbox Code Playgroud)

另外,为什么第二个实现返回Foo {}false

javascript prototype instantiation

21
推荐指数
2
解决办法
925
查看次数

编程到接口是什么意思?

我一直听到大多数与节目相关的网站上的声明:

编程到接口而不是实现

但是我不明白其含义?
例子会有所帮助.

编辑:我收到了很多好的答案,所以你可以用一些代码片段来补充它,以便更好地理解这个主题.谢谢!

java interface

19
推荐指数
5
解决办法
5911
查看次数

如果未修改,dicts是否保留迭代顺序?

如果我在Python中有一个字典,并且我遍历它一次,然后再次,那么迭代顺序是否保证保留,因为我没有插入,删除或更新字典中的任何项目?(但我可能已经做过查找).

python algorithm hash dictionary

19
推荐指数
3
解决办法
4045
查看次数

比较对象的不同实现的优点/缺点

这个问题涉及基本相同代码的2种不同实现.

首先,使用委托创建一个比较方法,该方法可以在排序对象集合时用作参数:

class Foo
{
    public static Comparison<Foo> BarComparison = delegate(Foo foo1, Foo foo2)
    {
        return foo1.Bar.CompareTo(foo2.Bar);
    };
}
Run Code Online (Sandbox Code Playgroud)

当我想要一种以与CompareTo函数提供的方式不同的方式对Foo对象的集合进行排序时,我使用上述方法.例如:

List<Foo> fooList = new List<Foo>();
fooList.Sort(BarComparison);
Run Code Online (Sandbox Code Playgroud)

二,使用IComparer:

public class BarComparer : IComparer<Foo>
{
    public int Compare(Foo foo1, Foo foo2)
    {
        return foo1.Bar.CompareTo(foo2.Bar);
    }
}
Run Code Online (Sandbox Code Playgroud)

当我想在Foo对象的集合中对Foo对象进行二进制搜索时,我使用上面的代码.例如:

BarComparer comparer = new BarComparer();
List<Foo> fooList = new List<Foo>();
Foo foo = new Foo();
int index = fooList.BinarySearch(foo, comparer);
Run Code Online (Sandbox Code Playgroud)

我的问题是:

  • 每种实现的优点和缺点是什么?
  • 有哪些方法可以利用这些实现中的每一种?
  • 有没有办法以这种方式组合这些实现,我不需要复制代码?
  • 我是否可以仅使用其中一个实现来实现二分搜索和替代集合排序?

.net c# comparison icomparer

18
推荐指数
2
解决办法
2316
查看次数

在枚举中指定基础类型的用例是什么?

有什么意义

enum SomeEnum : byte // <----
{
  SomeValue = 0x01,
  ...
}
Run Code Online (Sandbox Code Playgroud)

当你必须进行转换只是为了将它分配给与枚举基础类型相同类型的变量?

byte b = (byte)SomeEnum.SomeValue;
Run Code Online (Sandbox Code Playgroud)

c# enums types

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

为什么在执行静态块时此Float常量为null?

以下代码在执行时打印nitesh null而不是预期nitesh 130.为什么n在执行静态块之前没有初始化?

class test
{
      static
      {
             System.out.println(test.str+"   "+test.n);
      }
      final static String str="nitesh";
      final static Float n=130f;
      public static void main(String []args)
      {
      }
}
Run Code Online (Sandbox Code Playgroud)

java static-initialization

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

使一个类在同一个实例中可调用

class Foo(object):
    def tick(self):
        print("something")

class Bar(object):
    def __init__(self):
        self.foo = Foo()

    def tick(self):
        #Here's what I do....
        self.foo.tick()

        #here's what my goal would be
        self.foo()

b = Bar()
b.tick()
Run Code Online (Sandbox Code Playgroud)

这基本上是我的目标.从我收集到的内容中我可以将tick功能更改为__call__,这样我就可以按照自己的意愿行事.其他几个答案说这会产生一个对象的新实例,这是否意味着它会使用self.foo的内存?或者它会成为一个全新的对象,新实例?或制作self.foo的副本?

此外还有一些缺点,可能会或可能不会表现出来.对于我的程序的特定部分,我检查对象是否有一个__call__来确定我传递的参数是函数还是变量,我真的不认为我想要允许它被调用(尽管如此,我认为该类在技术上将是一个函数.)有没有办法区分函数和可调用类?

还有什么能使这种做法变得不受欢迎(这是一种pythonic的工作方式吗?)?我的下一个想法是,鉴于其他变量前缀为__cant,在类之外使用,但这似乎不是这里的情况.

python class callable

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

带有多个参数的绑定函数

在阅读了一些非常基本的haskell后,我知道如何使用bind "链接"monadic动作,如:

echo = getLine >>= putStrLn
Run Code Online (Sandbox Code Playgroud)

(>>=) 运算符在这种方式下非常方便,但是如果我想链接带有多个参数的monadic动作(或仿函数)呢?

鉴于(>>=) :: m a -> (a -> m b) -> m b它似乎(>>=)只能提供一个论点.

例如,writeFile接受两个参数(a FilePath和内容).假设我有一个返回a的monadic动作FilePath,以及另一个返回String写入的动作.如何在writeFile不使用do-notation的情况下将它们组合在一起,但是以一般方式?

是否有任何类型的功能: m a -> m b -> (a -> b -> m c) -> m c可以做到这一点?

monads haskell

16
推荐指数
3
解决办法
2626
查看次数