小编Dan*_*owy的帖子

是否有类似Ruby的交互式shell(irb)用于Java?

去年我花了很多时间进行Ruby开发,在那段时间里我发现了irb,这使得运行一些"代码实验"变得简单而有趣.我最近换了团队,现在正在进行Java开发,我发现我真的很想念我的窗口.Java有这样的东西吗?

"使用Eclipse"不是一个好的答案.我正在使用Eclipse(呻吟),但Eclipse的铃声和口哨不是一回事.

ruby java irb

16
推荐指数
4
解决办法
4034
查看次数

ExpressionType.Assign的故事是什么?

我的印象是在lambda表达式中无法进行赋值.例如,以下(当然不是非常有用)代码

Expression<Action<int, int>> expr = (x, y) => y = x;
Run Code Online (Sandbox Code Playgroud)

产生编译器错误

An expression tree may not contain an assignment operator
Run Code Online (Sandbox Code Playgroud)

然而,根据Microsoft的文档,可以使用编程方式创建赋值表达式Expression.Assign.除非我弄错了,否则以下代码会产生等价Expression:

ParameterExpression xparam = Expression.Parameter(typeof(int), "x");
ParameterExpression yparam = Expression.Parameter(typeof(int), "y");
BinaryExpression body = Expression.Assign(yparam, xparam);
var expr = Expression.Lambda<Action<int, int>>(body, xparam, yparam);
var cexpr = expr.Compile();
Run Code Online (Sandbox Code Playgroud)

在这种情况下,编译器不会抱怨.我觉得我在这里错过了一些重要的区别.

c# linq lambda expression-trees

15
推荐指数
2
解决办法
2374
查看次数

为什么我不能在Scala子类中赋值给var?

假设我有以下抽象类:

abstract class A (var is_happy : Boolean) {
  def toggle_happiness();
}
Run Code Online (Sandbox Code Playgroud)

现在我想定义一个实现该toggle_happiness()方法的具体类:

class B (is_happy : Boolean) extends A (is_happy) {
  def toggle_happiness() = {
    is_happy = !is_happy
  }
}
Run Code Online (Sandbox Code Playgroud)

Scala的编译器给了我:

error: reassignment to val
   is_happy = !is_happy
            ^
Run Code Online (Sandbox Code Playgroud)

这里发生了什么?我认为在我的类中is_happy引用了var由我的构造函数设置的.我和这个名字有冲突is_happy吗?

谢谢,丹

inheritance constructor scala

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

我可以将任意函数传递给Scala中的另一个函数吗?

我是Scala的新手,能够将函数传递给其他函数非常简洁 - 但是我可以将任意函数引用传递给另一个函数吗?所述功能参数的arity将是固定的(也就是说,我也很好奇你是否可以传递任意arity的函数).我不断遇到类型错误.我尝试过使用Any但它似乎没有帮助.

例如,我有以下代码:

class CodeRunner(val user_defined: (Int) => Unit) {
  def run(input: Int) = {
    user_defined(input)
  }
}

def arbitrary_code(input: Int) = { println("Running with input " + input) }

val d1 = new CodeRunner(arbitrary_code)

d1.run(4)
Run Code Online (Sandbox Code Playgroud)

我得到:

Running with input 4
Run Code Online (Sandbox Code Playgroud)

现在,让我们说我想传递以下函数:

def arbitrary_code(input: String) = { println("Running with input " + input) }
Run Code Online (Sandbox Code Playgroud)

如何更改我的CodeRunner课程来处理它们?

polymorphism functional-programming scala function arity

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

类型'T'与'T'类型不兼容

我有两个用C#编写的库,我想在F#应用程序中使用它.两个库都使用相同的类型,但是,我无法说服F#的类型检查这个事实.

这是使用Office互操作类型的简单示例.F#似乎对这些类型问题特别敏感.在F#方面施放似乎并没有帮助这种情况.所有三个项目都引用了相同的程序集("Microsoft.Office.Interop.Excel"版本14.0.0.0).

在项目"Project1"(C#项目)中:

namespace Project1
{
    public class Class1
    {
        public static Microsoft.Office.Interop.Excel.Application GetApp()
        {
            return new Microsoft.Office.Interop.Excel.Application();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在项目"Project2"(C#项目)中:

namespace Project2
{
    public class Class2
    {
        Microsoft.Office.Interop.Excel.Application _app;

        public Class2(Microsoft.Office.Interop.Excel.Application app)
        {
            _app = app;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在项目"TestApp"(一个F#项目)中:

[<EntryPoint>]
let main argv = 
    let c2 = Project2.Class2(Project1.Class1.GetApp())
    0 
Run Code Online (Sandbox Code Playgroud)

任何提示?

编辑:

Class2使用以下动态转换更改对构造函数的调用可以解决问题:

let c2 = Project2.Class2(Project1.Class1.GetApp() :?> Microsoft.Office.Interop.Excel.Application)
Run Code Online (Sandbox Code Playgroud)

然而,这是不满意的,因为它是1)动态的,2)我仍然不明白为什么原始类型检查失败.

c# f# office-interop

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

这真的是从Java传递void函数到Scala方法的方法吗?

我最近一直在玩Scala/Java互操作,特别是从Java(7)调用Scala(2.10.4)代码.它比我想象的更令人愉快,但有些事情让我困惑.

例如,scala.runtime我有一个很好的AbstractFunction抽象类集合.但我没有看到任何没有返回值的方法.例如,假设我有以下Scala代码:

class MyClass(name: String) {
  def SayWhat(say_fn: String => Unit) = say_fn(name)
}
Run Code Online (Sandbox Code Playgroud)

我的理解是Java void或多或少是Scala的Unit,所以我可以通过以下Java匿名类来模糊地传递类似lambda的东西:

import scala.Function1;
import scala.runtime.AbstractFunction1;
import scala.runtime.BoxedUnit;

public class MyProgram {
  public static void main(String[] args) {
    MyClass mc = new MyClass("Dan");

    Function1<String, BoxedUnit> f = new AbstractFunction1<String, BoxedUnit>() {
      public BoxedUnit apply(String s) {
        System.out.println("Why, hello there " + s);
          return null;
      }
    };

    mc.SayWhat(f);
  }
}
Run Code Online (Sandbox Code Playgroud)

这显然不是最漂亮的事情,但我AbstractFunction真的很欣赏这些东西,相比之下我不得不做的事情!但是真的没有AbstractProcedure什么东西吗?另外,为什么我的"lambda"必须返回BoxedUnit …

java lambda scala scala-java-interop

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

LINQ passthrough提供商?

我已经实现了简单的IQueryableIQueryProvider在LINQ表达式树上收集统计数据的类.这部分工作正常.接下来,我想将表达式树传递给默认的LINQ-to-Objects提供程序进行评估,因为我不需要以任何不同的方式执行它.换句话说,我希望我的提供者收集统计信息作为副作用,将查询传递给默认的LINQ实现.

但是,我很难获得默认提供程序的句柄.我以为我可以简单地保存对原始IEnumerable集合的引用,然后返回默认提供程序(来自我的自定义IQueryable),如:

IQueryProvider IQueryable.Provider
{
    get { return _my_provider.OriginalIEnum().AsQueryable().Provider; }
}
Run Code Online (Sandbox Code Playgroud)

但这不能正常工作.代码最终会抛出一个StackOverflowException.我认为正在发生的事情(从调试模式中的单步执行中收集)是LINQ运行时从上面的方法中获取提供程序,然后从我的自定义中获取表达式树IQueryable,然后它注意到顶级表达式是我的习惯IQueryable.所以它重新开始这个过程,试图找到合适的提供者.它会无休止地执行此操作,直到发生堆栈溢出.

现在,我唯一能想到的就是想出另一个访问者,它生成了另一个IQueryable删除了自定义节点的表达式树,以便LINQ运行时调用默认的提供者.这是相当多的工作,因为我需要访问每个叶子以确保没有嵌套Call表达式IQueryable再次调用我的自定义.有更简单的方法吗?

谢谢您的帮助.

c# linq linq-to-objects custom-linq-providers

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

我可以告诉Make忽略环境变量吗?

我最近使用Make时遇到了一些奇怪的行为(v3.81).

假设我有以下Makefile:

FOOBAR = $(shell find nonexistentdirectory -iname "foobar" | tr '\n' ' ')

all:
    @echo "Hi"

clean:
    @echo "Hi again"
Run Code Online (Sandbox Code Playgroud)

看起来很简单吧?值得注意的是,它FOOBAR是一个"递归扩展变量",因此在我引用它之前不应该对它进行评估.请注意,我从不提及它.另请注意,nonexistentdirectory不存在您所期望的.

现在假设我FOOBAR 调用Make目标之前设置了shell:

compy386$ FOOBAR="stuff" make clean
find: nonexistentdirectory: No such file or directory
Hi again
Run Code Online (Sandbox Code Playgroud)

为什么FOOBAR要评估?显然,它与变量在shell中定义的事实有关.我是否应该预料到用户可能在shell中设置了变量?我在这做错了什么?!

bash makefile

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

为什么GCHandle.Alloc不能包含引用的pin对象?

我怀疑这个功能不存在的原因是实现它很复杂,很少有人需要它.为了安全起见,您需要固定工作,即,您希望固定可到达对象的整个图形.但它似乎并不是从根本上无法完成的事情.

例如,假设您有以下类:

[StructLayout(LayoutKind.Sequential)]
class SomeObject
{
    public SomeObject r;
}
Run Code Online (Sandbox Code Playgroud)

您分配的内容如下:

SomeObject o = new SomeObject();
Run Code Online (Sandbox Code Playgroud)

并尝试将其固定:

GCHandle oh = GCHandle.Alloc(o, GCHandleType.Pinned);
Run Code Online (Sandbox Code Playgroud)

你会得到可怕的:

Object contains non-primitive or non-blittable data.
Run Code Online (Sandbox Code Playgroud)

好的,好的,我可以忍受.但是假设我可以访问.NET的垃圾收集器实现.会有什么障碍?以下是我看到的障碍:

  1. 循环参考.
  2. 您希望垃圾收集器将自己限制为应用程序堆内的对象.
  3. 这可能需要很长时间.
  4. 使操作成为原子是困难/痛苦的.

在我看来,GC已经必须处理其中的一些问题.那我忘记了什么?

注意:在你问"你想要完成什么?"等之前,我要求的目的是研究代码,不一定限于C#,也不一定限于CLR.我知道摆弄运行时自己的内存并不是一个典型的场景.无论如何,这不是一个纯粹的推测性问题.

注2:另外,我不关心编组.我只关心钉扎.

c# pinvoke garbage-collection

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

GCHandle.FromIntPointer无法按预期工作

这是一个非常简单(完整)的程序,用于练习使用GCHandle.FromIntPointer:

using System;
using System.Runtime.InteropServices;

namespace GCHandleBugTest
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] arr = new int[10];

            GCHandle handle = GCHandle.Alloc(arr, GCHandleType.Pinned);
            IntPtr pointer = handle.AddrOfPinnedObject();
            GCHandle handle2 = GCHandle.FromIntPtr(pointer);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,此程序本质上是通过C#(4e)(第547页)CLR上用英语描述的过程的音译.然而,运行它会导致非托管异常,例如:

Additional Information: The runtime has encountered a fatal error. The address of the error was at 0x210bc39b, on thread 0x21bc. The error code is 0xc0000005. This error may be a bug in the CLR or in …

c# clr mono .net-4.5

4
推荐指数
2
解决办法
1574
查看次数

如何在Scala中引用未实例化的类?

您可以在Scala中执行以下操作非常简洁:

scala> class FooBar
defined class FooBar

scala> val a = new FooBar
a: FooBar = FooBar@7efeedca

scala> val the_class = a.getClass
the_class: java.lang.Class[_ <: FooBar] = class FooBar

scala> val b = the_class.newInstance
b: FooBar = FooBar@1ef1df56
Run Code Online (Sandbox Code Playgroud)

假设我想the_class直接设置值.我似乎能够声明一个正确类型的变量:

scala> var the_class: java.lang.Class[_ <: FooBar] = null
the_class: java.lang.Class[_ <: FooBar] = null
Run Code Online (Sandbox Code Playgroud)

但我似乎无法将变量绑定到任何值.这可能吗?

scala> the_class = class FooBar
<console>:1: error: illegal start of simple expression
       the_class = class FooBar
                   ^
scala> the_class = FooBar
<console>:9: error: not …
Run Code Online (Sandbox Code Playgroud)

types scala class

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

我可以在Scala中复制一个闭包吗?

这可能是一个半生不熟的想法,但我可以复制表达式的环境吗?请考虑以下示例:

class foo[T](block: => T) {
  var data = { () => block }
  def run() = { data() }
}

var a = 5

var b = new foo({ a += 1; println(a) })
var c = new foo({ a += 1; println(a) })

b.run()
c.run()
b.run()
c.run()
Run Code Online (Sandbox Code Playgroud)

我得到以下输出:

6
7
8
9
Run Code Online (Sandbox Code Playgroud)

但我真正想要的是以下内容:

6
6
7
7
Run Code Online (Sandbox Code Playgroud)

简而言之,foo一旦初始值得到解决,我希望在块中有变量的副本而不是引用它们.可以这样做吗? scala.util.DynamicVariable似乎很有希望,但我很难理解如何在上面的例子中使用它.

closures scala

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

为什么Scala编译器不接受这个lambda作为参数?

假设我有一个接口Thing:

abstract class Thing[A](a_thing: A) {
  def thingA = a_thing
}
Run Code Online (Sandbox Code Playgroud)

我实现Thing如下:

class SpecificThing(a: String) extends Thing[String](a)
Run Code Online (Sandbox Code Playgroud)

此外,假设我有一个函数,它接受一个Thing和一个lambda做的事情Thing作为参数:

def doSomething[A](fn: Thing[A] => A, t: Thing[A]) : A = fn(t)
Run Code Online (Sandbox Code Playgroud)

现在,让我们使用这些东西:

val st = new SpecificThing("hi")
val fn1: (Thing[String]) => String = (t: Thing[String]) => { t.thingA }
println(doSomething(fn1, st))
Run Code Online (Sandbox Code Playgroud)

这打印hi.到现在为止还挺好.但我很懒,而且我不喜欢打字这么多,所以我将程序改为以下内容:

type MyThing = Thing[String]
val st = new SpecificThing("hi")
val fn2: (MyThing) => String = (t: MyThing) => { t.thingA …
Run Code Online (Sandbox Code Playgroud)

generics lambda scala

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